home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Leser 15 / Amiga Plus Leser CD 15.iso / Tools / Freeware / reportplus / source / rp.c < prev    next >
Encoding:
C/C++ Source or Header  |  2002-03-13  |  95.4 KB  |  2,723 lines

  1. /* $Filename:    ReportPlus/Source/rp.c
  2.  * $VER:         Report+ 5.3
  3.  * $Description: Multipurpose utility
  4.  *
  5.  * © Copyright 1999-2002 James R. Jacobs. Freely distributable.
  6.  *        _
  7.  *       //      -=AMIGA=-
  8.  *      //
  9.  * _   //
  10.  * \\ //
  11.  *  \X/
  12.  
  13. #INCLUDES -------------------------------------------------------------- */
  14.  
  15. /* #include <assert.h> */
  16.  
  17. #include <exec/types.h>
  18. #include <exec/alerts.h>
  19. #include <exec/nodes.h>
  20. #include <exec/memory.h>
  21. #include <exec/execbase.h>
  22. #include <proto/exec.h>
  23. #include <intuition/intuition.h>
  24. #include <clib/intuition_protos.h>
  25. #include <intuition/gadgetclass.h>
  26. #include <libraries/gadtools.h>
  27. #include <clib/gadtools_protos.h>
  28. #include <workbench/workbench.h> /* struct DiskObject */
  29. #include <libraries/asl.h>
  30. #include <proto/asl.h>
  31. #include <dos/dos.h>
  32. #include <dos/dostags.h>
  33. #include <dos/dosextens.h>
  34. #include <proto/dos.h>
  35. #include <diskfont/diskfont.h>
  36. #include <proto/diskfont.h>
  37. #include <graphics/gfx.h>
  38. #include <graphics/displayinfo.h>
  39. #include <graphics/gels.h>
  40. #include <clib/graphics_protos.h>
  41. #include <utility/tagitem.h>
  42. #include <proto/utility.h>
  43. #include <workbench/icon.h>
  44. #include <clib/icon_protos.h>
  45. #include <clib/alib_protos.h>
  46. #include <resources/battmem.h>
  47. #include <resources/battmembitsamiga.h>
  48. #include <resources/battmembitsshared.h>
  49.  
  50. #define ALL_REACTION_CLASSES
  51. #define ALL_REACTION_MACROS
  52. #include <reaction/reaction.h>
  53. #include <clib/alib_protos.h>
  54. #include <clib/texteditor_protos.h>
  55. #include <gadgets/texteditor.h>
  56. #include <pragmas/texteditor_pragmas.h>
  57.  
  58. #define GID_0_LY1   0
  59. #define GID_0_BU1   1 // the function buttons must start from GID_O_BU1,
  60. #define GID_0_BU2   2 // and must all be consecutive.
  61. #define GID_0_BU3   3
  62. #define GID_0_BU4   4
  63. #define GID_0_BU5   5
  64. #define GID_0_BU6   6
  65. #define GID_0_BU7   7
  66. #define GID_0_BU8   8
  67. #define GID_0_BU9   9
  68. #define GID_0_BU10 10
  69. #define GID_0_BU11 11
  70. #define GID_0_BU12 12
  71. #define GID_0_ST1  13
  72. #define GID_0_LY2  14
  73. #define GIDS_0     GID_0_LY2
  74.  
  75. #include <ctype.h>
  76. #include <stdio.h>          /* FILE, printf() */
  77. #include <stdlib.h>         /* EXIT_SUCCESS, EXIT_FAILURE */
  78. #include <string.h>
  79. #include "rp.h"
  80. #include "boards.h"
  81.  
  82. #ifdef __STORM__
  83.    #pragma chip
  84. #endif
  85.  
  86. MODULE struct Image*  image[FUNCTIONS + 1];
  87. MODULE struct BitMap* bitmap[FUNCTIONS + 1];
  88. MODULE STRPTR         imagename[FUNCTIONS + 1] =
  89. {   "PROGDIR:images/f1.ilbm",
  90.     "PROGDIR:images/f2.ilbm",
  91.     "PROGDIR:images/f3.ilbm",
  92.     "PROGDIR:images/f4.ilbm",
  93.     "PROGDIR:images/f5.ilbm",
  94.     "PROGDIR:images/f6.ilbm",
  95.     "PROGDIR:images/f7.ilbm",
  96.     "PROGDIR:images/f8.ilbm",
  97.     "PROGDIR:images/f9.ilbm",
  98.     "PROGDIR:images/f10.ilbm",
  99.     "PROGDIR:images/f11.ilbm",
  100.     "PROGDIR:images/f12.ilbm",
  101.     "PROGDIR:images/amigan.ilbm"
  102. };
  103. MODULE STRPTR FunctionDesc[FUNCTIONS + 2] =
  104. {   // Edit
  105.     "Bug report",         // 1
  106.     "Aminet readme",      // 2
  107.     "Autodoc",            // 4
  108.     "Battery-backed RAM", // 9
  109.     "AGDB review",        // 1
  110.     // View
  111.     "Manufacturer IDs",   // 5
  112.     "IFF FORMs",          // 6
  113.     // Process
  114.     "EOLs/tabs",          // 7
  115.     "Icons",              // 12
  116.     // Report
  117.     "Path size",          // 8
  118.     "System files",       // 10
  119.     // Conduct
  120.     "ACSE test",          // 3
  121.     // (default)
  122.     TITLEBARTEXT
  123. };
  124.  
  125. AGLOBAL struct NewGadget Gadget =
  126. {   0, 0, /* left-x, top-y */
  127.     0, 0, /* width, height */
  128.     0,    /* text */
  129.     NULL, /* font */
  130.     NULL, /* gadget ID */
  131.     NULL, /* flags */
  132.     NULL, /* visual info */
  133.     NULL  /* user data */
  134. };
  135.  
  136. #define MENUENTRIES 13
  137. MODULE struct NewMenu NewMenu[MENUENTRIES] =
  138. {   { NM_TITLE, "Project",       0 , 0,               0, 0},
  139.     {  NM_ITEM, "New",          "N", NM_ITEMDISABLED, 0, 0},
  140.     {  NM_ITEM, "Open...",      "O", NM_ITEMDISABLED, 0, 0},
  141.     {  NM_ITEM, NM_BARLABEL,     0 , 0,               0, 0},
  142.     {  NM_ITEM, "Save",         "S", NM_ITEMDISABLED, 0, 0},
  143.     {  NM_ITEM, "Save As...",   "A", NM_ITEMDISABLED, 0, 0},
  144.     {  NM_ITEM, NM_BARLABEL,     0 , 0,               0, 0},
  145.     {  NM_ITEM, "Quit Report+", "Q", 0,               0, 0},
  146.     { NM_TITLE, "Help",          0 , 0,               0, 0},
  147.     {  NM_ITEM, "Manual...",    "M", 0,               0, 0},
  148.     {  NM_ITEM, NM_BARLABEL,     0 , 0,               0, 0},
  149.     {  NM_ITEM, "About...",     "?", 0,               0, 0},
  150.     {   NM_END, NULL,            0 , 0,               0, 0}
  151. };
  152.  
  153. MODULE void clearkybd(void);
  154. MODULE void menu(void);
  155. MODULE void parsewb(void);
  156. MODULE void eachwildcard(STRPTR subpattern, ABOOL gui);
  157. MODULE void menu_loop(ULONG gid);
  158. MODULE void AddPathnameToTail(struct List* ListPtr, STRPTR name);
  159. MODULE void clearpathlist(struct List* ListPtr);
  160. MODULE void FreePathnameNodes(struct List* ListPtr);
  161.  
  162. int CXBRK(void) { return(0); }    /* Disable SAS/C Ctrl-C handling */
  163. int chkabort(void) { return(0); } /* really */
  164.  
  165. MODULE  struct Window*           AboutWindowPtr  = NULL;
  166. AGLOBAL struct Library          *WindowBase      = NULL,
  167.                                 *LayoutBase      = NULL,
  168.                                 *ButtonBase      = NULL,
  169.                                 *TextEditorBase  = NULL,
  170.                                 *LabelBase       = NULL,
  171.                                 *ListBrowserBase = NULL,
  172.                                 *ChooserBase     = NULL,
  173.                                 *StringBase      = NULL,
  174.                                 *CheckBoxBase    = NULL,
  175.                                 *BoardsBase      = NULL,
  176.                                 *BitMapBase      = NULL,
  177.                                 *FuelGaugeBase   = NULL,
  178.                                 *IntegerBase     = NULL;
  179. AGLOBAL ABOOL                   done             = FALSE,
  180.                                 fillwindows      = FALSE,
  181.                                 stop             = FALSE;
  182. AGLOBAL TEXT                    asldir[VLONGFIELD + 1],
  183.                                 aslresult[VLONGFIELD + 1],
  184.                                 IOBuffer[LONGESTFIELD + 1],
  185.                                 globalname[VLONGFIELD + 1],
  186.                                 string[4096 + 1],
  187.                                 weekdaystring[LEN_DATSTRING],
  188.                                 datestring[LEN_DATSTRING],
  189.                                 timestring[LEN_DATSTRING];
  190. AGLOBAL WORD                    xsize;
  191. AGLOBAL SBYTE                   page             = 0,
  192.                                 closer           = 0;
  193. AGLOBAL ULONG                   fillcolour,
  194.                                 offset,
  195.                                 wbval,
  196.                                 signal;
  197. AGLOBAL ABOOL                   BattBuffer[96];
  198. AGLOBAL struct Library*         IconBase         = NULL;
  199. AGLOBAL struct Menu*            MenuPtr          = NULL;
  200. AGLOBAL struct Screen*          ScreenPtr        = NULL;
  201. AGLOBAL struct Window*          MainWindowPtr    = NULL;
  202. AGLOBAL struct VisualInfo*      VisualInfoPtr    = NULL;
  203. AGLOBAL struct ExAllData*       EADataPtr        = NULL;
  204. AGLOBAL struct Gadget          *BU99_Right       = NULL,
  205.                                *ST99_Output      = NULL,
  206.                                *BU99_OutputASL   = NULL,
  207.                                *CB99_Log         = NULL,
  208.                                *BU99_Update      = NULL,
  209.                                *BU99_Stop        = NULL,
  210.                                *BU99_TextEditor  = NULL,
  211.                                *GListPtr         = NULL,
  212.                                *PrevGadPtr       = NULL;
  213. AGLOBAL struct List             EmptyList,
  214.                                 FileList;
  215. AGLOBAL struct SharedStruct shared =
  216. {   TRUE, 0,
  217.     "", "", "", ""
  218. };
  219.  
  220. IMPORT struct ExecBase*     SysBase;
  221. // from f1.c
  222. IMPORT struct ReportStruct  report;
  223. // from f2.c
  224. IMPORT struct AminetStruct  aminet;
  225. // from f3.c
  226. IMPORT ABOOL                certified;
  227. // from f4.c
  228. IMPORT struct AutodocStruct autodoc;
  229. // from f6.c
  230. IMPORT struct IFFStruct     iff;
  231. // from f7.c
  232. IMPORT struct Gadget*       TE71_Status;
  233. // from f8.c
  234. IMPORT struct Gadget*       size_gadgets[GIDS_11 + 1];
  235. // from f9.c
  236. IMPORT struct Library*      BattMemBase;
  237. // from f10.c
  238. IMPORT struct Gadget*       files_gadgets[GIDS_10 + 1];
  239. // from f11.c
  240. IMPORT struct AGDBStruct    agdb;
  241. IMPORT struct Gadget*       agdb_gadgets[GIDS_11 + 1];
  242. // from f12.c
  243. IMPORT struct IconStruct    icon;
  244. IMPORT struct Gadget*       icon_gadgets[GIDS_12 + 1];
  245. IMPORT ABOOL                quit;
  246.  
  247. AGLOBAL       Object*          WinObject[FUNCTIONS + 1]; // note that WindowObject is a reserved macro
  248.  
  249. MODULE WORD                    windowx[FUNCTIONS + 1],
  250.                                windowy[FUNCTIONS + 1];
  251. MODULE TEXT                    pubscreen[256 + 1];
  252. MODULE WORD                    ysize;
  253. MODULE ULONG                   ksval;
  254. MODULE ABOOL                   logo   = TRUE;
  255. MODULE        Object          *AboutWinObject = NULL;
  256. MODULE struct Gadget*          gadgets[GIDS_0 + 1];
  257. MODULE struct RDArgs*          ArgsPtr           = NULL;
  258. MODULE struct TextFont*        FontPtr           = NULL;
  259. MODULE struct WBArg*           WBArg             = NULL;
  260. MODULE struct WBStartup*       WBMsg             = NULL;
  261. MODULE struct ASLBase*         ASLBase         = NULL;
  262. MODULE struct DiskFontBase*    DiskFontBase    = NULL;
  263. MODULE struct Library*         GadToolsBase    = NULL;
  264. MODULE struct IntuitionBase*   IntuitionBase   = NULL;
  265. MODULE struct Library*         VersionBase     = NULL;
  266. MODULE struct TextAttr         Topaz8 =
  267. {    (STRPTR) "topaz.font", 8, FS_NORMAL, FPF_ROMFONT | FPF_DESIGNED
  268. }, /* "topaz.font" is case-sensitive */ WormWars8 =
  269. {    (STRPTR) "WormWars.font", 8, FS_NORMAL, FPF_DISKFONT | FPF_DESIGNED
  270. };
  271. MODULE  struct EasyStruct       EasyStruct =
  272. {   sizeof(struct EasyStruct),
  273.     0,
  274.     "Report+: Error",
  275.     NULL,
  276.     "Quit"
  277. };
  278.  
  279. /* FUNCTIONS -------------------------------------------------------------- */
  280.  
  281. int main(int argc, char** argv)
  282. {   UWORD  i;
  283.     SLONG  args[13] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  284.     BPTR   OldDir;
  285.     SLONG  number = 0, hostid = 7;
  286.     BPTR   ConfigHandle = NULL;
  287.  
  288.     /* Start of program.
  289.  
  290.     version embedding into executable */
  291.  
  292.     if (0) /* that is, never */
  293.         Printf("$VER: Report+ 5.3 (8.2.2002)"); /* always d.m.y format */
  294.  
  295.     for (i = 0; i <= FUNCTIONS; i++)
  296.     {   WinObject[i] = NULL;
  297.     }
  298.  
  299.     /* Check for OS3.9+... */
  300.     if (!(IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", 40L)))
  301.     {   Printf("Report+: Need AmigaOS 3.9+!\n");
  302.         cleanexit(EXIT_FAILURE);
  303.     }
  304.     if ((ksval = SysBase->LibNode.lib_Version) < 40L)
  305.     {   Printf("Report+: Need AmigaOS 3.9+!\n");
  306.         cleanexit(EXIT_FAILURE);
  307.     }
  308.     if (!(VersionBase = (struct Library *) OpenLibrary("version.library", 0L)))
  309.         rq("Can't open version.library!");
  310.     wbval = VersionBase->lib_Version;
  311.     CloseLibrary((struct Library *) VersionBase);
  312.     VersionBase = NULL;
  313.     if (wbval < 45)
  314.     {   Printf("Report+: Need AmigaOS 3.9+!\n");
  315.         cleanexit(EXIT_FAILURE);
  316.     }
  317.  
  318.     if (!(GadToolsBase = (struct Library *) OpenLibrary("gadtools.library", 38L)))
  319.         rq("Can't open GadTools.library V38+!");
  320.     if (!(ASLBase = (struct ASLBase *) OpenLibrary("asl.library", 0L)))
  321.         rq("Can't open ASL.library!");
  322.     if (
  323.         (DiskFontBase = (struct DiskFontBase *) OpenLibrary("diskfont.library", 0L))
  324.     &&  (FontPtr = OpenDiskFont(&WormWars8))
  325.        )
  326.     {   Gadget.ng_TextAttr = (struct TextAttr *) &WormWars8;
  327.     } elif (!(FontPtr = OpenFont(&Topaz8)))
  328.     {   rq("Can't open fonts!");
  329.     } else
  330.     {   Gadget.ng_TextAttr = (struct TextAttr *) &Topaz8;
  331.     }
  332.  
  333.     if (!(ButtonBase      = OpenLibrary("gadgets/button.gadget", 44)))
  334.                        rq("OpenLibrary(\"gadgets/button.gadget\") failed!");
  335.     if (!(CheckBoxBase    = OpenLibrary("gadgets/checkbox.gadget", 44)))
  336.                        rq("OpenLibrary(\"gadgets/checkbox.gadget\") failed!");
  337.     if (!(ChooserBase     = OpenLibrary("gadgets/chooser.gadget", 44)))
  338.                        rq("OpenLibrary(\"gadgets/chooser.gadget\") failed!");
  339.     if (!(LabelBase       = OpenLibrary("images/label.image", 44)))
  340.                        rq("OpenLibrary(\"images/label.image\") failed!");
  341.     if (!(LayoutBase      = OpenLibrary("gadgets/layout.gadget", 44)))
  342.                        rq("OpenLibrary(\"gadgets/layout.gadget\") failed!");
  343.     if (!(ListBrowserBase = OpenLibrary("gadgets/listbrowser.gadget", 0)))
  344.                        rq("OpenLibrary(\"gadgets/listbrowser.gadget\") failed!");
  345.     if (!(StringBase      = OpenLibrary("gadgets/string.gadget", 44)))
  346.                        rq("OpenLibrary(\"gadgets/string.gadget\") failed!");
  347.     if (!(TextEditorBase  = OpenLibrary("gadgets/texteditor.gadget", 0)))
  348.                        rq("OpenLibrary(\"gadgets/texteditor.gadget\") failed!");
  349.     if (!(WindowBase      = OpenLibrary("window.class", 44)))
  350.                        rq("OpenLibrary(\"window.class\") failed!");
  351.     if (!(BitMapBase      = OpenLibrary("images/bitmap.image", 44)))
  352.                        rq("OpenLibrary(\"images/bitmap.image\") failed!");
  353.     if (!(FuelGaugeBase   = OpenLibrary("gadgets/fuelgauge.gadget", 0)))
  354.                        rq("OpenLibrary(\"gadgets/fuelgauge.gadget\") failed!");
  355.     if (!(IntegerBase     = OpenLibrary("gadgets/integer.gadget", 44)))
  356.                        rq("OpenLibrary(\"gadgets/integer.gadget\") failed!");
  357.     if (!(IconBase        = OpenLibrary("icon.library", 44L)))
  358.                        rq("Need icon.library V44+!");
  359.           BoardsBase      = OpenLibrary("boards.library", 0L);
  360.  
  361.     strcpy(shared.output, "RAM:Report.txt");
  362.     pubscreen[0] = 0;
  363.     NewList(&EmptyList);
  364.     NewList(&FileList);
  365.     for (i = 0; i <= FUNCTIONS; i++)
  366.     {   image[i]  =
  367.         bitmap[i] = NULL;
  368.     }
  369.     if (!(EADataPtr = AllocVec(4096, MEMF_CLEAR | MEMF_PUBLIC)))
  370.     {   rq("Out of memory!");
  371.     }
  372.  
  373.     report_init();    // f1
  374.     aminet_init();    // f2
  375.     autodoc_init();   // f4
  376.     size_init();      // f8
  377.     batt_init();      // f9
  378.     files_init();     // f10
  379.     newagdb(FALSE);   // f11
  380.     /* those must be done before we handle CLI arguments */
  381.  
  382.     if (argc) /* started from CLI */
  383.     {   if (!(ArgsPtr = ReadArgs
  384.         (   "-F=FILL/S,PUBSCREEN/K,-N=NOLOGO/S,FUNCTION/N,-I=ICONTYPE/K,"
  385.             "RESET/S,TIMEOUT/S,LUNS/S,SYNC_XFER/S,SLOW_SYNC/S,TAG_QUEUES/S,HOST_ID/K/N,"
  386.             "FILE/F",
  387.             (LONG *) args,
  388.             NULL
  389.     )))
  390.         {   Printf
  391.             (   "Usage: %s [-f|FILL] [PUBSCREEN <screen>] [-n|NOLOGO] "
  392.                 "[[FUNCTION] <function> "
  393.                 "[-i|ICONTYPE DISK|DRAWER|TOOL|PROJECT|TRASHCAN|DEVICE|KICKSTART|APPICON] "
  394.                 "[RESET [TIMEOUT] [LUNS] [SYNC_XFER] [SLOW_SYNC] [TAG_QUEUES] [HOST_ID <host_id>]] "
  395.                 "[[FILE] <file(s)...>]]\n",
  396.                 argv[0]
  397.             );
  398.             cleanexit(EXIT_FAILURE);
  399.     }
  400.         if (args[0])
  401.         {   fillwindows = TRUE;
  402.         }
  403.         if (args[1])
  404.         {   strcpy(pubscreen, (STRPTR) args[1]);
  405.         }
  406.         if (args[2])
  407.         {   logo = FALSE;
  408.         }
  409.         if (args[3])
  410.         {   number = (SLONG) (*((SLONG *) args[3]));
  411.             if (number >= 1 && number <= FUNCTIONS)
  412.             {   page = closer = (number * 10) + 1;
  413.                 shared.function = number;
  414.             } else
  415.             {   Printf("Report+: <function> must be 1-%ld!\n", FUNCTIONS);
  416.                 cleanexit(EXIT_FAILURE);
  417.         }   }
  418.         if (args[4])
  419.         {   if (number != 12)
  420.             {   Printf("%s: <function> must be 12 for this!\n", argv[0]);
  421.                 cleanexit(EXIT_FAILURE);
  422.             }
  423.             if (!stricmp((STRPTR) args[4], "DISK"))
  424.             {   icon.type = WBDISK;
  425.             } elif (!stricmp((STRPTR) args[4], "DRAWER"))
  426.             {   icon.type = WBDRAWER;
  427.             } elif (!stricmp((STRPTR) args[4], "TOOL"))
  428.             {   icon.type = WBTOOL;
  429.             } elif (!stricmp((STRPTR) args[4], "PROJECT"))
  430.             {   icon.type = WBPROJECT;
  431.             } elif (!stricmp((STRPTR) args[4], "TRASHCAN"))
  432.             {   icon.type = WBGARBAGE;
  433.             } elif (!stricmp((STRPTR) args[4], "DEVICE"))
  434.             {   icon.type = WBDEVICE;
  435.             } elif (!stricmp((STRPTR) args[4], "KICKSTART"))
  436.             {   icon.type = WBKICK;
  437.             } elif (!stricmp((STRPTR) args[4], "APPICON"))
  438.             {   icon.type = WBAPPICON;
  439.             } else
  440.             {   Printf("%s: <icontype> must be DISK, DRAWER, TOOL, PROJECT, TRASHCAN, DEVICE, KICKSTART or APPICON!\n", argv[0]);
  441.                 cleanexit(EXIT_FAILURE);
  442.         }   }
  443.         if (args[5] || args[6] || args[7] || args[8] || args[9] || args[10] || args[11])
  444.         {   if (number != 9)
  445.             {   Printf("%s: <function> must be 9 for this!\n", argv[0]);
  446.                 cleanexit(EXIT_FAILURE);
  447.             }
  448.             if (!args[5])
  449.             {   Printf("%s: You need the RESET switch for this!\n", argv[0]);
  450.                 cleanexit(EXIT_FAILURE);
  451.             }
  452.             for (i = 0; i <= 95; i++)
  453.             {   BattBuffer[i] = FALSE;
  454.             }
  455.             BattBuffer[BATTMEM_AMIGA_AMNESIA_ADDR]          =
  456.             BattBuffer[BATTMEM_SHARED_AMNESIA_ADDR]         = TRUE; // these bits are inverted
  457.             if (args[6])
  458.             {   BattBuffer[BATTMEM_SCSI_TIMEOUT_ADDR]       = TRUE;
  459.             } else BattBuffer[BATTMEM_SCSI_TIMEOUT_ADDR]    = FALSE;
  460.             if (args[7])
  461.             {   BattBuffer[BATTMEM_SCSI_LUNS_ADDR]          = TRUE;
  462.             } else BattBuffer[BATTMEM_SCSI_LUNS_ADDR]       = FALSE;
  463.             if (args[8])
  464.             {   BattBuffer[BATTMEM_SCSI_SYNC_XFER_ADDR]     = TRUE;
  465.             } else BattBuffer[BATTMEM_SCSI_SYNC_XFER_ADDR]  = FALSE;
  466.             if (args[9])
  467.             {   BattBuffer[BATTMEM_SCSI_FAST_SYNC_ADDR]     = TRUE;
  468.             } else BattBuffer[BATTMEM_SCSI_FAST_SYNC_ADDR]  = FALSE;
  469.             if (args[10])
  470.             {   BattBuffer[BATTMEM_SCSI_TAG_QUEUES_ADDR]    = TRUE;
  471.             } else BattBuffer[BATTMEM_SCSI_TAG_QUEUES_ADDR] = FALSE;
  472.             if (args[11]) // these bits are inverted
  473.             {   hostid = (SLONG) (*((SLONG *) args[11]));
  474.                 if (hostid < 0 || hostid > 7)
  475.                 {   Printf("%s: <host_id> must be 0-7!\n", argv[0]);
  476.                     cleanexit(EXIT_FAILURE);
  477.                 }
  478.                 BattBuffer[BATTMEM_SCSI_HOST_ID_ADDR]     = (hostid & 4)? 0 : 1;
  479.                 BattBuffer[BATTMEM_SCSI_HOST_ID_ADDR + 1] = (hostid & 2)? 0 : 1;
  480.                 BattBuffer[BATTMEM_SCSI_HOST_ID_ADDR + 2] = (hostid & 1)? 0 : 1;
  481.             }
  482.             if (!BattMemBase)
  483.             {   if (!(BattMemBase = OpenResource(BATTMEMNAME)))
  484.                 {   rq("Can't open battery RAM resource!");
  485.             }   }
  486.             writebatt(FALSE);
  487.             Printf("Done.\n");
  488.             cleanexit(EXIT_SUCCESS);
  489.         }
  490.         if (args[12])
  491.         {   switch(number)
  492.             {
  493.             case 1:
  494.                 strcpy(report.output, (STRPTR) args[12]);
  495.                 report.loaded = TRUE;
  496.                 loadreport();
  497.             break;
  498.             case 2:
  499.                 strcpy(aminet.output, (STRPTR) args[12]);
  500.                 loadaminet();
  501.             break;
  502.             case 4:
  503.                 strcpy(autodoc.output, (STRPTR) args[12]);
  504.                 loadautodoc();
  505.             break;
  506.             case 6:
  507.                 strcpy(iff.pathname, (STRPTR) args[12]);
  508.             break;
  509.             case 7:
  510.                 strcpy(shared.pathname, (STRPTR) args[12]);
  511.                 convert(FALSE);
  512.                 Printf("All done.\n");
  513.                 cleanexit(EXIT_SUCCESS);
  514.             break;
  515.             case 11:
  516.                 strcpy(  agdb.output, (STRPTR) args[12]);
  517.                 loadagdb();
  518.             break;
  519.             case 12:
  520.                 strcpy(shared.pathname, (STRPTR) args[12]);
  521.                 convert(FALSE);
  522.                 Printf("All done.\n");
  523.                 cleanexit(EXIT_SUCCESS);
  524.             break;
  525.             default:
  526.                 Printf("Report+: <function> must be 1, 2, 6, 7, 11 or 12 for this!\n");
  527.                 cleanexit(EXIT_FAILURE);
  528.             break;
  529.     }   }   }
  530.     else /* started from WB */
  531.     {   WBMsg = (struct WBStartup *) argv;
  532.         WBArg = WBMsg->sm_ArgList; /* head of the arg list */
  533.         for (i = 0; i < WBMsg->sm_NumArgs; i++, WBArg++)
  534.         {   if (WBArg->wa_Lock)
  535.             {   /* something that does not support locks */
  536.                 parsewb();
  537.             } else
  538.             {   /* lock supported; change to the proper directory */
  539.                 OldDir = CurrentDir(WBArg->wa_Lock);
  540.                 parsewb();
  541.                 CurrentDir(OldDir);
  542.             }
  543.             if (i == 1)
  544.             {   ; /* we were started from a project icon, which is
  545.                 currently unsupported */
  546.     }   }   }
  547.  
  548.     strcpy(asldir, "PROGDIR:");
  549.     /* RKM Libraries, p. 59-61: */
  550.     lockscreen();
  551.     if (GetVPModeID(&(ScreenPtr->ViewPort)) == INVALID_ID)
  552.     {   rq("Invalid default public screen mode ID!");
  553.     }
  554.     xsize = ScreenPtr->Width;
  555.     ysize = ScreenPtr->Height;
  556.     unlockscreen();
  557.  
  558.     for (i = 0; i <= FUNCTIONS; i++)
  559.     {   windowx[i] = windowy[i] = -1;
  560.     }
  561.  
  562.     if (ConfigHandle = (BPTR) Open("PROGDIR:ReportPlus.config", MODE_OLDFILE))
  563.     {   if (Read(ConfigHandle, IOBuffer, 23) != -1)
  564.         {   shared.log = IOBuffer[0]; // 0
  565.             manuf_config();           // 20
  566.             iff_config();             // 19
  567.             eol_config();             // 1..5
  568.             size_config();            // 6, 21, 22
  569.             files_config();           // 7..15
  570.             icon_config();            // 16..18
  571.         }
  572.         Close(ConfigHandle);
  573.         ConfigHandle = NULL;
  574.     }
  575.  
  576.     while(1)
  577.     {   shared.function = page / 10;
  578.         if (page == 11)
  579.             report1();
  580.         elif (page == 12)
  581.             sender();
  582.         elif (page == 13)
  583.             config();
  584.         elif (page == 14)
  585.             report2();
  586.         elif (page == 21)
  587.             aminet1();
  588.         elif (page == 31)
  589.             acse1();
  590.         elif (page == 32)
  591.             acse2();
  592.         elif (page == 33)
  593.             acse3();
  594.         elif (page == 41)
  595.             autodoc1();
  596.         elif (page == 42)
  597.             autodoc2();
  598.         elif (page == 51)
  599.             manuf1();
  600.         elif (page == 61)
  601.             iff1();
  602.         elif (page == 71)
  603.             eol1();
  604.         elif (page == 81)
  605.             size1();
  606.         elif (page == 91)
  607.             batt1();
  608.         elif (page == 101)
  609.             files1();
  610.         elif (page == 111)
  611.             agdb1();
  612.         elif (page == 121)
  613.         {   icon1();
  614.         } else
  615.         {   /* assert(page == 0); */
  616.             menu();
  617. }   }   }
  618.  
  619. MODULE void menu(void)
  620. {   PERSIST ABOOL       first = TRUE;
  621.     AUTO    struct Hook Hook0Struct;
  622.     AUTO    ULONG       i, tag[2];
  623.     AUTO    LONG        bgpen;
  624.  
  625.     if (first)
  626.     {   lockscreen();
  627.         for (i = 0; i < FUNCTIONS; i++)
  628.         {   image[i] = BitMapObject,
  629.                 BITMAP_SourceFile, imagename[i],
  630.                 BITMAP_Width,      35,
  631.                 BITMAP_Height,     32,
  632.                 BITMAP_Screen,     ScreenPtr,
  633.             EndImage;
  634.             if (!image[i])
  635.             {   rq("Can't create ReAction image(s)!");
  636.             }
  637.             GetAttr(BITMAP_BitMap, image[i], (ULONG *) &bitmap[i]);
  638.         }
  639.         unlockscreen();
  640.         first = FALSE;
  641.     }
  642.  
  643.     /* PAGE 0 ************************************************************* */
  644.  
  645.     certified = FALSE;
  646.  
  647.     gadtools(); // needed for menu strip
  648.     InitHook(&Hook0Struct, Hook0Func, NULL);
  649.  
  650.     lockscreen();
  651.  
  652.     bgpen = FindColor
  653.     (   ScreenPtr->ViewPort.ColorMap,
  654.         0x96969696,
  655.         0x96969696,
  656.         0x96969696,
  657.         -1
  658.     );
  659.  
  660.     if (logo)
  661.     {   tag[0] = LAYOUT_AddImage;
  662.         tag[1] = NewObject
  663.         (   BITMAP_GetClass(), NULL,
  664.             // bitmap tags
  665.             BITMAP_SourceFile, "PROGDIR:images/logo.ilbm",
  666.             BITMAP_Masking,    TRUE,
  667.             BITMAP_Screen,     ScreenPtr,
  668.             TAG_DONE
  669.         );
  670.     } else
  671.     {   tag[0] = TAG_IGNORE;
  672.         tag[1] = NULL;
  673.     }
  674.  
  675.     if (!(WinObject[0] = NewObject(WINDOW_GetClass(), NULL,
  676.         // window tags
  677.         WA_PubScreen,             ScreenPtr,
  678.         WA_ScreenTitle,           TITLEBARTEXT,
  679.         WA_Title,                 "Report+: Main Menu",
  680.         WA_Activate,              TRUE,
  681.         WA_DepthGadget,           TRUE,
  682.         WA_DragBar,               TRUE,
  683.         WA_CloseGadget,           TRUE,
  684.         WA_IDCMP,                 IDCMP_RAWKEY | IDCMP_INTUITICKS,
  685.         WINDOW_IDCMPHook,         &Hook0Struct,
  686.         WINDOW_IDCMPHookBits,     IDCMP_RAWKEY | IDCMP_INTUITICKS,
  687.         WINDOW_MenuStrip,         MenuPtr,
  688.         WINDOW_Position,          WPOS_CENTERSCREEN,
  689.         WINDOW_ParentGroup,       gadgets[GID_0_LY1] =
  690.         NewObject
  691.         (   LAYOUT_GetClass(),         NULL,
  692.             // root-layout tags
  693.             LAYOUT_Orientation,        LAYOUT_ORIENT_VERT,
  694.             LAYOUT_SpaceOuter,         TRUE,
  695.             LAYOUT_DeferLayout,        TRUE,
  696.             LAYOUT_AddChild,
  697.             NewObject
  698.             (   LAYOUT_GetClass(),     NULL,
  699.                 // layout tags
  700.                 LAYOUT_Orientation,    LAYOUT_ORIENT_HORIZ,
  701.                 LAYOUT_SpaceOuter,     TRUE,
  702.                 LAYOUT_DeferLayout,    TRUE,
  703.                 LAYOUT_HorizAlignment, LALIGN_CENTER,
  704.                 tag[0],                tag[1],
  705.                 TAG_DONE
  706.             ),
  707.             LAYOUT_AddChild,
  708.             NewObject
  709.             (   LAYOUT_GetClass(), NULL,
  710.                 // layout tags
  711.                 LAYOUT_Orientation,    LAYOUT_ORIENT_HORIZ,
  712.                 LAYOUT_SpaceOuter,     TRUE,
  713.                 LAYOUT_DeferLayout,    TRUE,
  714.                 LAYOUT_HorizAlignment, LALIGN_CENTER,
  715.                 LAYOUT_AddImage,
  716.                 NewObject
  717.                 (   LABEL_GetClass(),    NULL,
  718.                     // label tags
  719.                     LABEL_Justification, LJ_CENTRE,
  720.                     LABEL_Text,          "Edit:",
  721.                     TAG_END
  722.                 ),
  723.                 TAG_END
  724.             ),
  725.             CHILD_WeightedHeight,      0,
  726.             LAYOUT_AddChild,
  727.             NewObject
  728.             (   LAYOUT_GetClass(),         NULL,
  729.                 // layout tags
  730.                 LAYOUT_Orientation,        LAYOUT_ORIENT_HORIZ,
  731.                 LAYOUT_SpaceOuter,         TRUE,
  732.                 LAYOUT_DeferLayout,        TRUE,
  733.                 LAYOUT_AddChild,           gadgets[GID_0_BU1] =
  734.                 NewObject
  735.                 (   NULL, "button.gadget",
  736.                     // button tags
  737.                     GA_ID,                 GID_0_BU1,
  738.                     GA_Left,               20,
  739.                     GA_Top,                20,
  740.                     GA_Width,              41,
  741.                     GA_Height,             40,
  742.                     GA_RelVerify,          TRUE,
  743.                     GA_Image,
  744.                     NewObject
  745.                     (   BITMAP_GetClass(),   NULL,
  746.                         // bitmap tags
  747.                         BITMAP_BitMap,       bitmap[1 - 1],
  748.                         BITMAP_Width,        35,
  749.                         BITMAP_Height,       32,
  750.                         TAG_DONE
  751.                     ),
  752.                     BUTTON_BackgroundPen,    bgpen,
  753.                     BUTTON_FillPen,          bgpen,
  754.                     TAG_DONE
  755.                 ),
  756.                 LAYOUT_AddChild,           gadgets[GID_0_BU2] =
  757.                 NewObject
  758.                 (   NULL, "button.gadget",
  759.                     // button tags
  760.                     GA_ID,                 GID_0_BU2,
  761.                     GA_Left,               20,
  762.                     GA_Top,                20,
  763.                     GA_Width,              41,
  764.                     GA_Height,             40,
  765.                     GA_RelVerify,          TRUE,
  766.                     GA_Image,
  767.                     NewObject
  768.                     (   BITMAP_GetClass(),   NULL,
  769.                         // bitmap tags
  770.                         BITMAP_BitMap,       bitmap[2 - 1],
  771.                         BITMAP_Width,        35,
  772.                         BITMAP_Height,       32,
  773.                         TAG_DONE
  774.                     ),
  775.                     BUTTON_BackgroundPen,    bgpen,
  776.                     BUTTON_FillPen,          bgpen,
  777.                     TAG_DONE
  778.                 ),
  779.                 LAYOUT_AddChild,           gadgets[GID_0_BU3] =
  780.                 NewObject
  781.                 (   NULL, "button.gadget",
  782.                     // button tags
  783.                     GA_ID,                 GID_0_BU3,
  784.                     GA_Left,               20,
  785.                     GA_Top,                20,
  786.                     GA_Width,              41,
  787.                     GA_Height,             40,
  788.                     GA_RelVerify,          TRUE,
  789.                     GA_Image,              NewObject
  790.                     (   BITMAP_GetClass(),   NULL,
  791.                         // bitmap tags
  792.                         BITMAP_BitMap,       bitmap[4 - 1],
  793.                         BITMAP_Width,        35,
  794.                         BITMAP_Height,       32,
  795.                         TAG_DONE
  796.                     ),
  797.                     BUTTON_BackgroundPen,    bgpen,
  798.                     BUTTON_FillPen,          bgpen,
  799.                     TAG_DONE
  800.                 ),
  801.                 LAYOUT_AddChild,           gadgets[GID_0_BU4] = NewObject
  802.                 (   NULL, "button.gadget",
  803.                     // button tags
  804.                     GA_ID,                 GID_0_BU4,
  805.                     GA_Left,               20,
  806.                     GA_Top,                20,
  807.                     GA_Width,              41,
  808.                     GA_Height,             40,
  809.                     GA_RelVerify,          TRUE,
  810.                     GA_Image,              NewObject
  811.                     (   BITMAP_GetClass(),   NULL,
  812.                         // bitmap tags
  813.                         BITMAP_BitMap,       bitmap[9 - 1],
  814.                         BITMAP_Width,        35,
  815.                         BITMAP_Height,       32,
  816.                         TAG_DONE
  817.                     ),
  818.                     BUTTON_BackgroundPen,    bgpen,
  819.                     BUTTON_FillPen,          bgpen,
  820.                     TAG_DONE
  821.                 ),
  822.                 LAYOUT_AddChild,           gadgets[GID_0_BU5] = (struct Gadget *) NewObject
  823.                 (   NULL, "button.gadget",
  824.                     // button tags
  825.                     GA_ID,                 GID_0_BU5,
  826.                     GA_Left,               20,
  827.                     GA_Top,                20,
  828.                     GA_Width,              41,
  829.                     GA_Height,             40,
  830.                     GA_RelVerify,          TRUE,
  831.                     GA_Image,              NewObject
  832.                     (   BITMAP_GetClass(),   NULL,
  833.                         // bitmap tags
  834.                         BITMAP_BitMap,       bitmap[11 - 1],
  835.                         BITMAP_Width,        35,
  836.                         BITMAP_Height,       32,
  837.                         TAG_DONE
  838.                     ),
  839.                     BUTTON_BackgroundPen,    bgpen,
  840.                     BUTTON_FillPen,          bgpen,
  841.                     TAG_DONE
  842.                 ),
  843.                 TAG_DONE
  844.             ),
  845.             LAYOUT_AddChild,
  846.             NewObject
  847.             (   LAYOUT_GetClass(),         NULL,
  848.                 // layout tags
  849.                 LAYOUT_Orientation,        LAYOUT_ORIENT_HORIZ,
  850.                 LAYOUT_SpaceOuter,         TRUE,
  851.                 LAYOUT_DeferLayout,        TRUE,
  852.                 LAYOUT_AddChild,
  853.                 NewObject
  854.                 (   LAYOUT_GetClass(),         NULL,
  855.                     // layout tags
  856.                     LAYOUT_Orientation,        LAYOUT_ORIENT_VERT,
  857.                     LAYOUT_SpaceOuter,         TRUE,
  858.                     LAYOUT_DeferLayout,        TRUE,
  859.                     LAYOUT_AddChild,
  860.                     NewObject
  861.                     (    LAYOUT_GetClass(),    NULL,
  862.                          // layout tags
  863.                          LAYOUT_Orientation,   LAYOUT_ORIENT_HORIZ,
  864.                          LAYOUT_SpaceOuter,    TRUE,
  865.                          LAYOUT_DeferLayout,   TRUE,
  866.                          LAYOUT_HorizAlignment, LALIGN_CENTER,
  867.                          LAYOUT_AddImage,
  868.                          NewObject
  869.                          (   LABEL_GetClass(), NULL,
  870.                              // label tags
  871.                              LABEL_Justification, LJ_CENTRE,
  872.                              LABEL_Text,          "View:",
  873.                              TAG_END
  874.                          ),
  875.                          TAG_DONE
  876.                     ),
  877.                     LAYOUT_AddChild,
  878.                     NewObject
  879.                     (   LAYOUT_GetClass(),         NULL,
  880.                         // layout tags
  881.                         LAYOUT_Orientation,        LAYOUT_ORIENT_HORIZ,
  882.                         LAYOUT_SpaceOuter,         TRUE,
  883.                         LAYOUT_DeferLayout,        TRUE,
  884.                         LAYOUT_AddChild,           gadgets[GID_0_BU6] =
  885.                         NewObject
  886.                         (   NULL, "button.gadget",
  887.                             // button tags
  888.                             GA_ID,                 GID_0_BU6,
  889.                             GA_Left,               20,
  890.                             GA_Top,                20,
  891.                             GA_Width,              41,
  892.                             GA_Height,             40,
  893.                             GA_RelVerify,          TRUE,
  894.                             GA_Image,              NewObject
  895.                             (   BITMAP_GetClass(),   NULL,
  896.                                 // bitmap tags
  897.                                 BITMAP_BitMap,       bitmap[5 - 1],
  898.                                 BITMAP_Width,        35,
  899.                                 BITMAP_Height,       32,
  900.                                 TAG_DONE
  901.                             ),
  902.                             BUTTON_BackgroundPen,    bgpen,
  903.                             BUTTON_FillPen,          bgpen,
  904.                             TAG_DONE
  905.                         ),
  906.                         LAYOUT_AddChild,           gadgets[GID_0_BU7] =
  907.                         NewObject
  908.                         (   NULL, "button.gadget",
  909.                             // button tags
  910.                             GA_ID,                 GID_0_BU7,
  911.                             GA_Left,               20,
  912.                             GA_Top,                20,
  913.                             GA_Width,              41,
  914.                             GA_Height,             40,
  915.                             GA_RelVerify,          TRUE,
  916.                             GA_Image,              NewObject
  917.                             (   BITMAP_GetClass(),   NULL,
  918.                                 // bitmap tags
  919.                                 BITMAP_BitMap,       bitmap[6 - 1],
  920.                                 BITMAP_Width,        35,
  921.                                 BITMAP_Height,       32,
  922.                                 TAG_DONE
  923.                             ),
  924.                             BUTTON_BackgroundPen,    bgpen,
  925.                             BUTTON_FillPen,          bgpen,
  926.                             TAG_DONE
  927.                         ),
  928.                         TAG_DONE
  929.                     ),
  930.                     TAG_DONE
  931.                 ),
  932.                 LAYOUT_AddChild,
  933.                 NewObject
  934.                 (   LAYOUT_GetClass(),         NULL,
  935.                     // layout tags
  936.                     LAYOUT_Orientation,        LAYOUT_ORIENT_VERT,
  937.                     LAYOUT_SpaceOuter,         TRUE,
  938.                     LAYOUT_DeferLayout,        TRUE,
  939.                     LAYOUT_AddChild,
  940.                     NewObject
  941.                     (    LAYOUT_GetClass(),    NULL,
  942.                          // layout tags
  943.                          LAYOUT_Orientation,   LAYOUT_ORIENT_HORIZ,
  944.                          LAYOUT_SpaceOuter,    TRUE,
  945.                          LAYOUT_DeferLayout,   TRUE,
  946.                          LAYOUT_HorizAlignment, LALIGN_CENTER,
  947.                          LAYOUT_AddImage,
  948.                          NewObject
  949.                          (   LABEL_GetClass(), NULL,
  950.                              // label tags
  951.                              LABEL_Justification, LJ_CENTRE,
  952.                              LABEL_Text,          "Process:",
  953.                              TAG_END
  954.                          ),
  955.                          TAG_DONE
  956.                     ),
  957.                     LAYOUT_AddChild,
  958.                     NewObject
  959.                     (   LAYOUT_GetClass(),         NULL,
  960.                         // layout tags
  961.                         LAYOUT_Orientation,        LAYOUT_ORIENT_HORIZ,
  962.                         LAYOUT_SpaceOuter,         TRUE,
  963.                         LAYOUT_DeferLayout,        TRUE,
  964.                         LAYOUT_AddChild,           gadgets[GID_0_BU8] =
  965.                         NewObject
  966.                         (   NULL, "button.gadget",
  967.                             // button tags
  968.                             GA_ID,                 GID_0_BU8,
  969.                             GA_Left,               20,
  970.                             GA_Top,                20,
  971.                             GA_Width,              41,
  972.                             GA_Height,             40,
  973.                             GA_RelVerify,          TRUE,
  974.                             GA_Image,              NewObject
  975.                             (   BITMAP_GetClass(),   NULL,
  976.                                 // bitmap tags
  977.                                 BITMAP_BitMap,       bitmap[7 - 1],
  978.                                 BITMAP_Width,        35,
  979.                                 BITMAP_Height,       32,
  980.                                 TAG_DONE
  981.                             ),
  982.                             BUTTON_BackgroundPen,    bgpen,
  983.                             BUTTON_FillPen,          bgpen,
  984.                             TAG_DONE
  985.                         ),
  986.                         LAYOUT_AddChild,           gadgets[GID_0_BU9] =
  987.                         NewObject
  988.                         (   NULL, "button.gadget",
  989.                             // button tags
  990.                             GA_ID,                 GID_0_BU9,
  991.                             GA_Left,               20,
  992.                             GA_Top,                20,
  993.                             GA_Width,              41,
  994.                             GA_Height,             40,
  995.                             GA_RelVerify,          TRUE,
  996.                             GA_Image,              NewObject
  997.                             (   BITMAP_GetClass(),   NULL,
  998.                                 // bitmap tags
  999.                                 BITMAP_BitMap,       bitmap[12 - 1],
  1000.                                 BITMAP_Width,        35,
  1001.                                 BITMAP_Height,       32,
  1002.                                 TAG_DONE
  1003.                             ),
  1004.                             BUTTON_BackgroundPen,    bgpen,
  1005.                             BUTTON_FillPen,          bgpen,
  1006.                             TAG_DONE
  1007.                         ),
  1008.                         TAG_DONE
  1009.                     ),
  1010.                     TAG_DONE
  1011.                 ),
  1012.                 TAG_DONE
  1013.             ),
  1014.             LAYOUT_AddChild,
  1015.             NewObject
  1016.             (   LAYOUT_GetClass(),         NULL,
  1017.                 // layout tags
  1018.                 LAYOUT_Orientation,        LAYOUT_ORIENT_HORIZ,
  1019.                 LAYOUT_SpaceOuter,         TRUE,
  1020.                 LAYOUT_DeferLayout,        TRUE,
  1021.                 LAYOUT_AddChild,
  1022.                 NewObject
  1023.                 (   LAYOUT_GetClass(),         NULL,
  1024.                     // layout tags
  1025.                     LAYOUT_Orientation,        LAYOUT_ORIENT_VERT,
  1026.                     LAYOUT_SpaceOuter,         TRUE,
  1027.                     LAYOUT_DeferLayout,        TRUE,
  1028.                     LAYOUT_AddChild,
  1029.                     NewObject
  1030.                     (    LAYOUT_GetClass(),       NULL,
  1031.                          // layout tags
  1032.                          LAYOUT_Orientation,      LAYOUT_ORIENT_HORIZ,
  1033.                          LAYOUT_SpaceOuter,       TRUE,
  1034.                          LAYOUT_DeferLayout,      TRUE,
  1035.                          LAYOUT_HorizAlignment,   LALIGN_CENTER,
  1036.                          LAYOUT_AddImage,
  1037.                          NewObject
  1038.                          (   LABEL_GetClass(),    NULL,
  1039.                              // label tags
  1040.                              LABEL_Justification, LJ_CENTRE,
  1041.                              LABEL_Text,          "Report:",
  1042.                              TAG_END
  1043.                          ),
  1044.                          TAG_DONE
  1045.                     ),
  1046.                     LAYOUT_AddChild,
  1047.                     NewObject
  1048.                     (   LAYOUT_GetClass(),         NULL,
  1049.                         // layout tags
  1050.                         LAYOUT_Orientation,        LAYOUT_ORIENT_HORIZ,
  1051.                         LAYOUT_SpaceOuter,         TRUE,
  1052.                         LAYOUT_DeferLayout,        TRUE,
  1053.                         LAYOUT_AddChild,           gadgets[GID_0_BU10] =
  1054.                         NewObject
  1055.                         (   NULL, "button.gadget",
  1056.                             // button tags
  1057.                             GA_ID,                 GID_0_BU10,
  1058.                             GA_Left,               20,
  1059.                             GA_Top,                20,
  1060.                             GA_Width,              41,
  1061.                             GA_Height,             40,
  1062.                             GA_RelVerify,          TRUE,
  1063.                             GA_Image,              NewObject
  1064.                             (   BITMAP_GetClass(),   NULL,
  1065.                                 // bitmap tags
  1066.                                 BITMAP_BitMap,       bitmap[8 - 1],
  1067.                                 BITMAP_Width,        35,
  1068.                                 BITMAP_Height,       32,
  1069.                                 TAG_DONE
  1070.                             ),
  1071.                             BUTTON_BackgroundPen,    bgpen,
  1072.                             BUTTON_FillPen,          bgpen,
  1073.                             TAG_DONE
  1074.                         ),
  1075.                         LAYOUT_AddChild,           gadgets[GID_0_BU11] =
  1076.                         NewObject
  1077.                         (   NULL,                  "button.gadget",
  1078.                             // button tags
  1079.                             GA_ID,                 GID_0_BU11,
  1080.                             GA_Left,               20,
  1081.                             GA_Top,                20,
  1082.                             GA_Width,              41,
  1083.                             GA_Height,             40,
  1084.                             GA_RelVerify,          TRUE,
  1085.                             GA_Image,              NewObject
  1086.                             (   BITMAP_GetClass(),   NULL,
  1087.                                 // bitmap tags
  1088.                                 BITMAP_BitMap,       bitmap[10 - 1],
  1089.                                 BITMAP_Width,        35,
  1090.                                 BITMAP_Height,       32,
  1091.                                 TAG_DONE
  1092.                             ),
  1093.                             BUTTON_BackgroundPen,    bgpen,
  1094.                             BUTTON_FillPen,          bgpen,
  1095.                             TAG_DONE
  1096.                         ),
  1097.                         TAG_DONE
  1098.                     ),
  1099.                     TAG_DONE
  1100.                 ),
  1101.                 LAYOUT_AddChild,
  1102.                 NewObject
  1103.                 (   LAYOUT_GetClass(),         NULL,
  1104.                     // layout tags
  1105.                     LAYOUT_Orientation,        LAYOUT_ORIENT_VERT,
  1106.                     LAYOUT_SpaceOuter,         TRUE,
  1107.                     LAYOUT_DeferLayout,        TRUE,
  1108.                     LAYOUT_AddChild,
  1109.                     NewObject
  1110.                     (    LAYOUT_GetClass(),    NULL,
  1111.                          // layout tags
  1112.                          LAYOUT_Orientation,   LAYOUT_ORIENT_HORIZ,
  1113.                          LAYOUT_SpaceOuter,    TRUE,
  1114.                          LAYOUT_DeferLayout,   TRUE,
  1115.                          LAYOUT_HorizAlignment, LALIGN_CENTER,
  1116.                          LAYOUT_AddImage,
  1117.                          NewObject
  1118.                          (   LABEL_GetClass(), NULL,
  1119.                              // label tags
  1120.                              LABEL_Justification, LJ_CENTRE,
  1121.                              LABEL_Text,          "Conduct:",
  1122.                              TAG_END
  1123.                          ),
  1124.                          TAG_DONE
  1125.                     ),
  1126.                     LAYOUT_AddChild,
  1127.                     NewObject
  1128.                     (   LAYOUT_GetClass(),         NULL,
  1129.                         // layout tags
  1130.                         LAYOUT_Orientation,        LAYOUT_ORIENT_HORIZ,
  1131.                         LAYOUT_SpaceOuter,         TRUE,
  1132.                         LAYOUT_DeferLayout,        TRUE,
  1133.                         LAYOUT_AddChild,           gadgets[GID_0_BU12] =
  1134.                         NewObject
  1135.                         (   NULL, "button.gadget",
  1136.                             // button tags
  1137.                             GA_ID,                 GID_0_BU12,
  1138.                             GA_Left,               20,
  1139.                             GA_Top,                20,
  1140.                             GA_Width,              41,
  1141.                             GA_Height,             40,
  1142.                             GA_RelVerify,          TRUE,
  1143.                             GA_Image,              NewObject
  1144.                             (   BITMAP_GetClass(),   NULL,
  1145.                                 // bitmap tags
  1146.                                 BITMAP_BitMap,       bitmap[3 - 1],
  1147.                                 BITMAP_Width,        35,
  1148.                                 BITMAP_Height,       32,
  1149.                                 TAG_DONE
  1150.                             ),
  1151.                             BUTTON_BackgroundPen,  bgpen,
  1152.                             BUTTON_FillPen,        bgpen,
  1153.                             TAG_DONE
  1154.                         ),
  1155.                         TAG_DONE
  1156.                     ),
  1157.                     TAG_DONE
  1158.                 ),
  1159.                 TAG_DONE
  1160.             ),
  1161.             LAYOUT_AddChild,          gadgets[GID_0_ST1] =
  1162.             NewObject
  1163.             (   STRING_GetClass(),    NULL,
  1164.                 // string tags
  1165.                 GA_ID,                GID_0_ST1,
  1166.                 GA_ReadOnly,          TRUE,
  1167.                 STRINGA_TextVal,      TITLEBARTEXT,
  1168.                 TAG_END
  1169.             ),
  1170.             CHILD_WeightedHeight,     0,
  1171.             TAG_DONE
  1172.         ),
  1173.         TAG_DONE
  1174.     )))
  1175.     {   rq("Can't create ReAction gadgets!");
  1176.     }
  1177.     unlockscreen();
  1178.     openwindow();
  1179.     loop();
  1180.     closewindow();
  1181. }
  1182.  
  1183. AGLOBAL void cleanexit(SBYTE rc)
  1184. {   BPTR  ConfigHandle;
  1185.     ULONG i;
  1186.  
  1187.     /* ASL requesters are assumed to be already closed.
  1188.     iffparse.library is never opened or closed. :-O */
  1189.  
  1190.     /* help|about... */
  1191.     if (AboutWindowPtr)
  1192.     {   DisposeObject(AboutWinObject);
  1193.         AboutWindowPtr = NULL;
  1194.     }
  1195.  
  1196.     /* all */
  1197.     unlockscreen(); // in case the screen is locked
  1198.     closewindow();
  1199.  
  1200.     IOBuffer[0] = shared.log;
  1201.  
  1202.     /* Remember that you can't fool around with the list whilst the
  1203.     gadget is still using it. So we close the window before calling
  1204.     these next routines. */
  1205.  
  1206.     report_die();  // f1: deallocates "subsystem" list
  1207.     aminet_exit(); // f2: deallocates "subdirectory" list
  1208.     aminet_die();  // f2: deallocates "main directory" list
  1209.     acse_exit();   // f3: shuts down timer
  1210.     manuf_die();
  1211.     eol_die();
  1212.     size_exit();
  1213.     size_die();    // f8: deallocates "empty" (1-node) columnar list
  1214.     files_exit();  // f10: deallocates "result" list & closes logfile handle
  1215.     files_die();
  1216.     icon_die();
  1217.  
  1218.     if (EADataPtr)
  1219.     {   FreeVec(EADataPtr);
  1220.         EADataPtr = NULL;
  1221.     }
  1222.     if (FontPtr)
  1223.     {   CloseFont(FontPtr);
  1224.         FontPtr = NULL;
  1225.     }
  1226.     if (ArgsPtr)
  1227.     {   FreeArgs(ArgsPtr);
  1228.         ArgsPtr = NULL;
  1229.     }
  1230.  
  1231.     /* Dispose the images ourselves as button.gadget doesn't
  1232.      * do this for its GA_Image...
  1233.      */
  1234.     for (i = 0; i <= FUNCTIONS; i++)
  1235.     {   if (image[i])
  1236.         {   DisposeObject(image[i]);
  1237.             image[i] = NULL;
  1238.     }   }
  1239.  
  1240.  
  1241.     if (rc == EXIT_SUCCESS)
  1242.     {   if (ConfigHandle = (BPTR) Open("PROGDIR:ReportPlus.config", MODE_NEWFILE))
  1243.         {   Write(ConfigHandle, IOBuffer, 23);
  1244.             Close(ConfigHandle);
  1245.             ConfigHandle = NULL;
  1246.     }   }
  1247.  
  1248.     /* Reaction */
  1249.     CloseLibrary(WindowBase);
  1250.     CloseLibrary(TextEditorBase);
  1251.     CloseLibrary(StringBase);
  1252.     CloseLibrary(ListBrowserBase);
  1253.     CloseLibrary(LayoutBase);
  1254.     CloseLibrary(LabelBase);
  1255.     CloseLibrary(IntegerBase);
  1256.     CloseLibrary(FuelGaugeBase);
  1257.     CloseLibrary(ChooserBase);
  1258.     CloseLibrary(CheckBoxBase);
  1259.     CloseLibrary(ButtonBase);
  1260.     CloseLibrary(BitMapBase);
  1261.  
  1262.     if (BoardsBase)
  1263.         CloseLibrary((struct Library *) BoardsBase);
  1264.     if (IconBase)
  1265.         CloseLibrary((struct Library *) IconBase);
  1266.     if (DiskFontBase)
  1267.         CloseLibrary((struct Library *) DiskFontBase);
  1268.     if (ASLBase)
  1269.         CloseLibrary((struct Library *) ASLBase);
  1270.     if (GadToolsBase)
  1271.         CloseLibrary((struct Library *) GadToolsBase);
  1272.     if (IntuitionBase)
  1273.     {   OpenWorkBench();
  1274.         CloseLibrary((struct Library *) IntuitionBase);
  1275.     }
  1276.  
  1277.     exit(rc); /* End of program. */
  1278. }
  1279.  
  1280. MODULE void clearkybd(void)
  1281. {   struct IntuiMessage* MsgPtr;
  1282.  
  1283.     while (MsgPtr = (struct IntuiMessage *) GT_GetIMsg(MainWindowPtr->UserPort))
  1284.         GT_ReplyIMsg(MsgPtr);
  1285. }
  1286.  
  1287. AGLOBAL void FreeNameNodes(struct List* ListPtr)
  1288. {   /* RKM Libraries, p. 496:
  1289.     
  1290.     "Free the entire list, including the header. The header is not
  1291.     updated as the list is freed. This function demonstrates how to
  1292.     avoid referencing freed memory when deallocating nodes." */
  1293.  
  1294.     struct NameNode *WorkNodePtr, *NextNodePtr;
  1295.     
  1296.     WorkNodePtr = (struct NameNode *) (ListPtr->lh_Head); /* first node */
  1297.     while (NextNodePtr = (struct NameNode *) (WorkNodePtr->nn_Node.ln_Succ))
  1298.     {   FreeMem(WorkNodePtr, sizeof(struct NameNode));
  1299.         WorkNodePtr = NextNodePtr;
  1300. }   }
  1301. MODULE void FreePathnameNodes(struct List* ListPtr)
  1302. {   struct PathnameNode *WorkNodePtr, *NextNodePtr;
  1303.     
  1304.     WorkNodePtr = (struct PathnameNode *) (ListPtr->lh_Head); /* first node */
  1305.     while (NextNodePtr = (struct PathnameNode *) (WorkNodePtr->nn_Node.ln_Succ))
  1306.     {   FreeMem(WorkNodePtr, sizeof(struct PathnameNode));
  1307.         WorkNodePtr = NextNodePtr;
  1308. }   }
  1309.  
  1310. AGLOBAL void gadtools(void)
  1311. {   lockscreen();
  1312.     if (!(Gadget.ng_VisualInfo = VisualInfoPtr = (struct VisualInfo *) GetVisualInfo(ScreenPtr, TAG_DONE)))
  1313.     {   rq("Can't get GadTools visual info!");
  1314.     }
  1315.     unlockscreen();
  1316.  
  1317.     if (!(MenuPtr = (struct Menu *) CreateMenus(NewMenu, TAG_DONE)))
  1318.     {   rq("Can't create menus!");
  1319.     }
  1320.     if (!(LayoutMenus(MenuPtr, VisualInfoPtr, GTMN_NewLookMenus, TRUE, TAG_DONE)))
  1321.     {   rq("Can't lay out menus!");
  1322.     }
  1323.     GListPtr = NULL; /* that needs doing for the CreateContext() call */
  1324.     if (!(PrevGadPtr = (struct Gadget *) CreateContext(&GListPtr)))
  1325.     {   rq("Can't create GadTools context!");
  1326. }   }
  1327.  
  1328. AGLOBAL void verynewwindow(SWORD width, SWORD height, STRPTR title, ULONG idcmp)
  1329. {   WORD thewindowx, thewindowy;
  1330.  
  1331.     // Function to open a GadTools window.
  1332.  
  1333.     gadtools();
  1334.     lockscreen();
  1335.  
  1336.     if (page == 12 || page == 13 || page == 32 || page == 33)
  1337.     {   thewindowx = (xsize / 2) - (width / 2);
  1338.         thewindowy = 12 + ((ysize - 12) / 2) - (height / 2);
  1339.     } else
  1340.     {   if (windowx[page / 10] == -1)
  1341.         {   windowx[page / 10] = (xsize / 2) - (width / 2);
  1342.             windowy[page / 10] = 12 + ((ysize - 12) / 2) - (height / 2);
  1343.         }
  1344.         thewindowx = windowx[page / 10];
  1345.         thewindowy = windowy[page / 10];
  1346.     }
  1347.  
  1348.     /* open the window on the public screen */
  1349.     if (!(MainWindowPtr = (struct Window*) OpenWindowTags
  1350.     (   NULL,
  1351.         WA_Left,         thewindowx,
  1352.         WA_Top,          thewindowy,
  1353.         WA_Width,        width,
  1354.         WA_Height,       height,
  1355.         WA_IDCMP,        IDCMP_CLOSEWINDOW | IDCMP_MENUPICK | IDCMP_REFRESHWINDOW
  1356.                          | IDCMP_MOUSEBUTTONS | IDCMP_INTUITICKS | IDCMP_VANILLAKEY
  1357.                          | IDCMP_RAWKEY | idcmp,
  1358.         WA_Gadgets,      NULL,
  1359.         WA_PubScreen,    ScreenPtr,
  1360.         WA_Activate,     TRUE,
  1361.         WA_Title,        title,
  1362.         WA_DragBar,      TRUE,
  1363.         WA_DepthGadget,  TRUE,
  1364.         WA_CloseGadget,  TRUE,
  1365.         WA_SmartRefresh, TRUE,
  1366.         WA_NewLookMenus, TRUE,
  1367.         TAG_DONE
  1368.     )))
  1369.     {   rq("Can't open window!");
  1370.     }
  1371.     unlockscreen();
  1372.     signal = 1L << MainWindowPtr->UserPort->mp_SigBit;
  1373.  
  1374.     SetMenuStrip(MainWindowPtr, MenuPtr);
  1375.     SetFont(MainWindowPtr->RPort, FontPtr);
  1376.  
  1377.     if (fillwindows)
  1378.     {   getfillcolour();
  1379.         SetAPen
  1380.         (   MainWindowPtr->RPort,
  1381.             fillcolour
  1382.         );
  1383.         RectFill
  1384.         (   MainWindowPtr->RPort,
  1385.             MainWindowPtr->BorderLeft,
  1386.             MainWindowPtr->BorderTop,
  1387.              width - 1 - MainWindowPtr->BorderRight,
  1388.             height - 1 - MainWindowPtr->BorderBottom
  1389.         );
  1390.     }
  1391.  
  1392.     navigate();
  1393. }
  1394.  
  1395. AGLOBAL void helpabout(void)
  1396. {   PERSIST ABOOL first = TRUE;
  1397.  
  1398.     if (AboutWindowPtr)
  1399.     {   return;
  1400.     }
  1401.  
  1402.     lockscreen();
  1403.  
  1404.     if (first)
  1405.     {   image[12] = BitMapObject,
  1406.             BITMAP_SourceFile, imagename[12],
  1407.             BITMAP_Width,      44,
  1408.             BITMAP_Height,     38,
  1409.             BITMAP_Screen,     ScreenPtr,
  1410.         EndImage;
  1411.         if (!image[12])
  1412.         {   rq("Can't create ReAction image!");
  1413.         }
  1414.         GetAttr(BITMAP_BitMap, image[12], (ULONG *) &bitmap[12]);
  1415.         unlockscreen();
  1416.         first = FALSE;
  1417.     }
  1418.  
  1419.     if (!(AboutWinObject = NewObject(WINDOW_GetClass(), NULL,
  1420.         // window tags
  1421.         WA_PubScreen,             ScreenPtr,
  1422.         WA_ScreenTitle,           TITLEBARTEXT,
  1423.         WA_Title,                 "About Report+",
  1424.         WA_Activate,              TRUE,
  1425.         WA_DepthGadget,           TRUE,
  1426.         WA_DragBar,               TRUE,
  1427.         WA_CloseGadget,           TRUE,
  1428.         WINDOW_Position,          WPOS_CENTERSCREEN,
  1429.         WINDOW_ParentGroup,       gadgets[GID_0_LY2] =
  1430.         NewObject
  1431.         (   LAYOUT_GetClass(),         NULL,
  1432.             // root-layout tags
  1433.             LAYOUT_Orientation,        LAYOUT_ORIENT_HORIZ,
  1434.             LAYOUT_SpaceOuter,         TRUE,
  1435.             LAYOUT_DeferLayout,        TRUE,
  1436.             LAYOUT_AddChild,
  1437.             NewObject
  1438.             (   LAYOUT_GetClass(),     NULL,
  1439.                 // layout tags
  1440.                 LAYOUT_Orientation,    LAYOUT_ORIENT_VERT,
  1441.                 LAYOUT_SpaceOuter,     TRUE,
  1442.                 LAYOUT_DeferLayout,    TRUE,
  1443.                 LAYOUT_VertAlignment,  LALIGN_CENTER,
  1444.                 LAYOUT_AddImage,
  1445.                 NewObject
  1446.                 (   BITMAP_GetClass(),   NULL,
  1447.                     // bitmap tags
  1448.                     BITMAP_BitMap,       bitmap[12],
  1449.                     BITMAP_Width,        44,
  1450.                     BITMAP_Height,       38,
  1451.                     TAG_DONE
  1452.                 ),
  1453.                 TAG_DONE
  1454.             ),
  1455.             LAYOUT_AddChild,
  1456.             NewObject
  1457.             (   LAYOUT_GetClass(), NULL,
  1458.                 // layout tags
  1459.                 LAYOUT_Orientation,    LAYOUT_ORIENT_VERT,
  1460.                 LAYOUT_SpaceOuter,     TRUE,
  1461.                 LAYOUT_DeferLayout,    TRUE,
  1462.                 LAYOUT_AddChild,
  1463.                 NewObject
  1464.                 (   LAYOUT_GetClass(), NULL,
  1465.                     // layout tags
  1466.                     LAYOUT_Orientation,    LAYOUT_ORIENT_HORIZ,
  1467.                     LAYOUT_SpaceOuter,     FALSE,
  1468.                     LAYOUT_DeferLayout,    TRUE,
  1469.                     LAYOUT_AddImage,
  1470.                     NewObject
  1471.                     (   LABEL_GetClass(),    NULL,
  1472.                         // label tags
  1473.                         LABEL_Justification, LJ_CENTRE,
  1474.                         LABEL_Text,          TITLEBARTEXT,
  1475.                         TAG_END
  1476.                     ),
  1477.                     TAG_END
  1478.                 ),
  1479.                 LAYOUT_AddChild,
  1480.                 NewObject
  1481.                 (   LAYOUT_GetClass(), NULL,
  1482.                     // layout tags
  1483.                     LAYOUT_Orientation,    LAYOUT_ORIENT_HORIZ,
  1484.                     LAYOUT_SpaceOuter,     FALSE,
  1485.                     LAYOUT_DeferLayout,    TRUE,
  1486.                     LAYOUT_AddImage,
  1487.                     NewObject
  1488.                     (   LABEL_GetClass(),    NULL,
  1489.                         // label tags
  1490.                         LABEL_Justification, LJ_CENTRE,
  1491.                         LABEL_Text,          "Friday 8 February 2002",
  1492.                         TAG_END
  1493.                     ),
  1494.                     TAG_END
  1495.                 ),
  1496.                 LAYOUT_AddChild,
  1497.                 NewObject
  1498.                 (   LAYOUT_GetClass(), NULL,
  1499.                     // layout tags
  1500.                     LAYOUT_Orientation,    LAYOUT_ORIENT_HORIZ,
  1501.                     LAYOUT_SpaceOuter,     FALSE,
  1502.                     LAYOUT_DeferLayout,    TRUE,
  1503.                     LAYOUT_AddImage,
  1504.                     NewObject
  1505.                     (   LABEL_GetClass(),    NULL,
  1506.                         // label tags
  1507.                         LABEL_Justification, LJ_CENTRE,
  1508.                         LABEL_Text,          "© 2002 Amigan Software",
  1509.                         TAG_END
  1510.                     ),
  1511.                     TAG_END
  1512.                 ),
  1513.                 LAYOUT_AddChild,
  1514.                 NewObject
  1515.                 (   LAYOUT_GetClass(), NULL,
  1516.                     // layout tags
  1517.                     LAYOUT_Orientation,    LAYOUT_ORIENT_HORIZ,
  1518.                     LAYOUT_SpaceOuter,     FALSE,
  1519.                     LAYOUT_DeferLayout,    TRUE,
  1520.                     LAYOUT_AddImage,
  1521.                     NewObject
  1522.                     (   LABEL_GetClass(),    NULL,
  1523.                         // label tags
  1524.                         LABEL_Justification, LJ_CENTRE,
  1525.                         LABEL_Text,          " ",
  1526.                         TAG_END
  1527.                     ),
  1528.                     TAG_END
  1529.                 ),
  1530.                 LAYOUT_AddChild,
  1531.                 NewObject
  1532.                 (   LAYOUT_GetClass(), NULL,
  1533.                     // layout tags
  1534.                     LAYOUT_Orientation,    LAYOUT_ORIENT_HORIZ,
  1535.                     LAYOUT_SpaceOuter,     FALSE,
  1536.                     LAYOUT_DeferLayout,    TRUE,
  1537.                     LAYOUT_AddImage,
  1538.                     NewObject
  1539.                     (   LABEL_GetClass(),    NULL,
  1540.                         // label tags
  1541.                         LABEL_Justification, LJ_CENTRE,
  1542.                         LABEL_Text,          "By James R. Jacobs",
  1543.                         TAG_END
  1544.                     ),
  1545.                     TAG_END
  1546.                 ),
  1547.                 TAG_DONE
  1548.             ),
  1549.             TAG_DONE
  1550.         ),
  1551.         TAG_DONE
  1552.     )))
  1553.     {   rq("Can't create ReAction objects!");
  1554.     }
  1555.     unlockscreen();
  1556.  
  1557.     if (!(AboutWindowPtr = (struct Window *) DoMethod((Object *) AboutWinObject, WM_OPEN, NULL)))
  1558.     {   rq("Can't open ReAction window!");
  1559.     }
  1560.  
  1561.     OffMenu(MainWindowPtr, FULLMENUNUM(MN_HELP, IN_ABOUT, NOSUB));
  1562. }
  1563.  
  1564. AGLOBAL void closewindow(void)
  1565. {   if (MainWindowPtr)
  1566.     {   clearkybd();
  1567.  
  1568.         if
  1569.         (   shared.function == 0
  1570.          || shared.function == 4
  1571.          || shared.function == 5
  1572.          || shared.function == 8
  1573.          || shared.function == 10
  1574.          || shared.function == 11
  1575.          || shared.function == 12
  1576.         )
  1577.         {   /* Disposing of the window object will also close the window if it is
  1578.              * already opened, and it will dispose of the layout object attached to it.
  1579.              */
  1580.             DisposeObject(WinObject[shared.function]);
  1581.             WinObject[shared.function] = NULL;
  1582.             MainWindowPtr = NULL;
  1583.         } else
  1584.         {   if (closer != 32 && closer != 33)
  1585.             {   // memorize the position of the window, for next time
  1586.                 windowx[closer / 10] = MainWindowPtr->LeftEdge;
  1587.                 windowy[closer / 10] = MainWindowPtr->TopEdge;
  1588.             }
  1589.             ClearMenuStrip(MainWindowPtr);
  1590.             CloseWindow(MainWindowPtr);
  1591.             MainWindowPtr = NULL;
  1592.     }   }
  1593.     if (GListPtr)
  1594.     {   FreeGadgets(GListPtr);
  1595.         GListPtr = NULL;
  1596.     }
  1597.     if (MenuPtr)
  1598.     {   FreeMenus(MenuPtr);
  1599.         MenuPtr = NULL;
  1600.     }
  1601.     if (VisualInfoPtr)
  1602.     {   FreeVisualInfo(VisualInfoPtr);
  1603.         VisualInfoPtr = NULL;
  1604. }   }
  1605.  
  1606. AGLOBAL ABOOL asl(STRPTR pattern)
  1607. {   struct FileRequester* ASLRqPtr;
  1608.     ABOOL                 success;
  1609.  
  1610.     /* asldir is the directory that the ASL requester will start in. */
  1611.  
  1612.     if (!(ASLRqPtr = AllocAslRequestTags(ASL_FileRequest, ASL_Pattern, pattern, ASL_Window, MainWindowPtr, TAG_DONE)))
  1613.         rq("Can't create ASL request!");
  1614.     if
  1615.     (   AslRequestTags(ASLRqPtr, ASL_Dir, asldir, ASL_Hail, "Report+ file selector", ASL_FuncFlags, FILF_PATGAD, TAG_DONE)
  1616.      && *(ASLRqPtr->rf_File) != 0
  1617.     )
  1618.     {   strcpy(asldir, ASLRqPtr->rf_Dir);
  1619.         strcpy(aslresult, ASLRqPtr->rf_Dir);
  1620.         if (!AddPart(aslresult, ASLRqPtr->rf_File, VLONGFIELD))
  1621.         {   FreeAslRequest(ASLRqPtr);
  1622.             rq("Can't add filename to pathname!");
  1623.         }
  1624.         success = TRUE;
  1625.     } else
  1626.     {   // either the user chose Cancel, or clicked OK with an empty filename
  1627.         strcpy(aslresult, "");
  1628.         success = FALSE;
  1629.     }
  1630.     // assert(ASLRqPtr);
  1631.     FreeAslRequest(ASLRqPtr);
  1632.     return(success);
  1633. }
  1634.  
  1635. AGLOBAL void loop(void)
  1636. {   AUTO SWORD                oldpage = page;
  1637.     AUTO struct Gadget*       addr;
  1638.     AUTO struct IntuiMessage* MsgPtr;
  1639.     AUTO UWORD                code, qual;
  1640.     AUTO ULONG                class, result;
  1641.     AUTO SWORD                mousex, mousey;
  1642.  
  1643.     closer = page;
  1644.     done = FALSE;
  1645.     while (page == oldpage && !done)
  1646.     {   if (AboutWindowPtr)
  1647.         {   if (aboutloop())
  1648.             {   DisposeObject(AboutWinObject);
  1649.                 AboutWindowPtr = NULL;
  1650.                 OnMenu(MainWindowPtr, FULLMENUNUM(MN_HELP, IN_ABOUT, NOSUB));
  1651.         }   }
  1652.         else
  1653.         {   if ((Wait(signal | SIGBREAKF_CTRL_C)) & SIGBREAKF_CTRL_C)
  1654.             {  done = TRUE;
  1655.                /* should we clear the Ctrl-C signal? */
  1656.         }   }
  1657.         if
  1658.         (   shared.function ==  0
  1659.          || (shared.function == 1 && page == 14)
  1660.          || shared.function ==  4
  1661.          || shared.function ==  5
  1662.          || shared.function ==  8
  1663.          || shared.function == 10
  1664.          || shared.function == 11
  1665.          || shared.function == 12
  1666.         ) // handle ReAction windows
  1667.         {   while ((result = DoMethod(WinObject[shared.function], WM_HANDLEINPUT, &code)) != WMHI_LASTMSG)
  1668.             {   switch (result & WMHI_CLASSMASK)
  1669.                 {
  1670.                 case WMHI_MENUPICK:
  1671.                     handlemenus(code);
  1672.                 break;
  1673.                 case WMHI_CLOSEWINDOW:
  1674.                     cleanexit(EXIT_SUCCESS);
  1675.                 break;
  1676.                 case WMHI_GADGETUP:
  1677.                     switch(shared.function)
  1678.                     {
  1679.                     case 0:
  1680.                         menu_loop(result & WMHI_GADGETMASK);
  1681.                     break;
  1682.                     case 1:
  1683.                         report_ra_loop(result & WMHI_GADGETMASK);
  1684.                     break;
  1685.                     case 4:
  1686.                         autodoc_loop(result & WMHI_GADGETMASK);
  1687.                     break;
  1688.                     case 5:
  1689.                         manuf_loop(result & WMHI_GADGETMASK);
  1690.                     break;
  1691.                     case 8:
  1692.                         size_loop(result & WMHI_GADGETMASK);
  1693.                     break;
  1694.                     case 10:
  1695.                         files_loop(result & WMHI_GADGETMASK);
  1696.                     break;
  1697.                     case 11:
  1698.                         agdb_loop(result & WMHI_GADGETMASK);
  1699.                     break;
  1700.                     case 12:
  1701.                         icon_loop(result & WMHI_GADGETMASK);
  1702.                     break;
  1703.                     default:
  1704.                         ; // assert(0);
  1705.                     break;
  1706.                     }
  1707.                 break;
  1708.                 default:
  1709.                 break;
  1710.         }   }   }
  1711.         else // handle GadTools windows
  1712.         {   while (MsgPtr = (struct IntuiMessage *) GT_GetIMsg(MainWindowPtr->UserPort))
  1713.             {   class  = MsgPtr->Class;                       
  1714.                 code   = MsgPtr->Code;
  1715.                 addr   = MsgPtr->IAddress;
  1716.                 qual   = MsgPtr->Qualifier;
  1717.                 mousex = MsgPtr->MouseX;
  1718.                 mousey = MsgPtr->MouseY;
  1719.                 GT_ReplyIMsg(MsgPtr);
  1720.                 if (class == IDCMP_CLOSEWINDOW && page == 31)
  1721.                 {   acse_loop(IDCMP_CLOSEWINDOW, addr, code);
  1722.                 } else
  1723.                 {   switch(class)
  1724.                     {
  1725.                     case IDCMP_MENUPICK:
  1726.                         handlemenus(code);
  1727.                     break;
  1728.                     case IDCMP_CLOSEWINDOW:
  1729.                         cleanexit(EXIT_SUCCESS);
  1730.                     break;
  1731.                     case IDCMP_REFRESHWINDOW:
  1732.                         GT_BeginRefresh(MainWindowPtr);
  1733.                         GT_EndRefresh(MainWindowPtr, TRUE);
  1734.                     break;
  1735.                     default:
  1736.                         if (class == IDCMP_RAWKEY && code == SCAN_HELP)
  1737.                             helpabout();
  1738.                         elif (class == IDCMP_VANILLAKEY && code == ESCAPE && ((qual & IEQUALIFIER_LSHIFT) || (qual & IEQUALIFIER_RSHIFT)))
  1739.                             cleanexit(EXIT_SUCCESS);
  1740.                         elif (page >= 11 && page <= 13)
  1741.                             report_gt_loop(class, addr, code, qual);
  1742.                         elif (page == 21)
  1743.                             aminet_loop(class, addr, code, qual);
  1744.                         elif (page >= 31 && page <= 33)
  1745.                             acse_loop(class, addr, code);
  1746.                         elif (page == 61)
  1747.                             iff_loop(class, addr, code, qual);
  1748.                         elif (page == 71)
  1749.                             eol_loop(class, addr, code, qual);
  1750.                         elif (page == 91)
  1751.                             batt_loop(class, addr, code, qual, mousex, mousey);
  1752.                     break;
  1753. }   }   }   }   }   }
  1754.  
  1755. AGLOBAL void navigate(void)
  1756. {   gadtools();
  1757.  
  1758.     /* BU99_Right is created first, as all windows use it. Therefore all
  1759.     windows can safely call AddGList(), etc. with the BU99_Right argument. */
  1760.  
  1761.     /* next */
  1762.     switch(page)
  1763.     {
  1764.     case 11:
  1765.         setgadget(            10,  REPORTHEIGHT - 16,      REPORTWIDTH - 20, 12, "Menu",     NULL);
  1766.     break;
  1767.     case 12:
  1768.         setgadget(            10,  SENDERHEIGHT - 16,      SENDERWIDTH - 20, 12, "OK",     NULL);
  1769.     break;
  1770.     case 13:
  1771.         setgadget(            10,  CONFIGHEIGHT - 16,      CONFIGWIDTH - 20, 12, "OK",     NULL);
  1772.     break;
  1773.     case 21:
  1774.         setgadget(            10,  AMINETHEIGHT - 16,      AMINETWIDTH - 20, 12, "Menu",     NULL);
  1775.     break;
  1776.     case 31:
  1777.         setgadget(            10,   ACSE1HEIGHT - 16,       ACSE1WIDTH - 20, 12, "Menu",     NULL);
  1778.     break;
  1779.     case 32:
  1780.         if (certified)
  1781.             setgadget(        10,   ACSE2HEIGHT - 16,       ACSE2WIDTH - 20, 12, "OK",       NULL);
  1782.         else                                                                                 
  1783.             setgadget(        10,   ACSE2HEIGHT - 16,       ACSE2WIDTH - 20, 12, "Menu",     NULL);
  1784.     break;
  1785.     case 33:
  1786.         setgadget(            10,   ACSE3HEIGHT - 16,       ACSE3WIDTH - 20, 12, "Menu",     NULL);
  1787.     break;
  1788.     case 61:
  1789.         setgadget(            10,    IFF1HEIGHT - 16,        IFF1WIDTH - 20, 12, "Menu",     NULL);
  1790.     break;
  1791.     case 71:
  1792.         setgadget(            10,    EOL1HEIGHT - 16,        EOL1WIDTH - 20, 12, "Menu",     NULL);
  1793.     break;
  1794.     case 91:
  1795.         setgadget(            10,   BATT1HEIGHT - 16,       BATT1WIDTH - 20, 12, "Menu",     NULL);
  1796.     break;
  1797.     default:
  1798.     break;
  1799.     }
  1800.     BU99_Right = PrevGadPtr = (struct Gadget *) CreateGadget
  1801.     (   BUTTON_KIND,
  1802.         PrevGadPtr,
  1803.         &Gadget,
  1804.         GT_Underscore, '_',
  1805.         TAG_DONE
  1806.     );
  1807. }
  1808.  
  1809. AGLOBAL void setgadget(WORD leftx, WORD topy, WORD width, WORD height,
  1810. STRPTR text, ULONG flags)
  1811. {   Gadget.ng_LeftEdge   = leftx;
  1812.     Gadget.ng_TopEdge    = topy;
  1813.     Gadget.ng_Width      = width;
  1814.     Gadget.ng_Height     = height;
  1815.     Gadget.ng_GadgetText = text;
  1816.     Gadget.ng_Flags      = flags;
  1817. }
  1818.  
  1819. AGLOBAL ABOOL readin(STRPTR pathname)
  1820. {   BPTR FileHandle;
  1821.  
  1822.     if (!(FileHandle = (BPTR) Open(pathname, MODE_OLDFILE)))
  1823.         return FALSE;
  1824.     if (Read(FileHandle, IOBuffer, LONGESTFIELD) == -1)
  1825.     /* Limitation: the whole file must be < 16K */
  1826.     {   Close(FileHandle);
  1827.         return FALSE;
  1828.     }
  1829.     Close(FileHandle);
  1830.     return TRUE;
  1831. }
  1832.  
  1833. AGLOBAL void writeout(STRPTR pathname)
  1834. {   BPTR FileHandle;
  1835.  
  1836.     if (!(FileHandle = (BPTR) Open(pathname, MODE_NEWFILE)))
  1837.         rq("Can't open file for writing!");
  1838.     if (Write(FileHandle, IOBuffer, strlen(IOBuffer)) == -1)
  1839.     {   Close(FileHandle);
  1840.         rq("Can't write to file!");
  1841.     }
  1842.     Close(FileHandle);
  1843. }
  1844.  
  1845. AGLOBAL void rq(STRPTR text)
  1846. {   EasyStruct.es_TextFormat = text;
  1847.     EasyRequest(MainWindowPtr, &EasyStruct, NULL);
  1848.  
  1849.     cleanexit(EXIT_FAILURE);
  1850. }
  1851.  
  1852. AGLOBAL void readordie(STRPTR pathname)
  1853. {   BPTR FileHandle;
  1854.  
  1855.     if (!(FileHandle = (BPTR) Open(pathname, MODE_OLDFILE)))
  1856.         rq("Can't open file for reading!");
  1857.     if (Read(FileHandle, IOBuffer, LONGESTFIELD) == -1)
  1858.     {   Close(FileHandle);
  1859.         rq("Can't read file!");
  1860.     }
  1861.     if (!Close(FileHandle))
  1862.         rq("Can't close file for reading!");
  1863. }
  1864.  
  1865. MODULE void parsewb(void)
  1866. {   struct DiskObject* DiskObject;
  1867.     STRPTR*            ToolArray;
  1868.     STRPTR             s;
  1869.  
  1870.     if ((*WBArg->wa_Name) && (DiskObject = GetDiskObject(WBArg->wa_Name)))
  1871.     {   ToolArray = (STRPTR *) DiskObject->do_ToolTypes;
  1872.  
  1873.         if (s = FindToolType((CONST_STRPTR *) ToolArray, "FILL"))
  1874.             fillwindows = TRUE;
  1875.         if (s = FindToolType((CONST_STRPTR *) ToolArray, "PUBSCREEN"))
  1876.             strcpy(pubscreen, s);
  1877.         if (s = FindToolType((CONST_STRPTR *) ToolArray, "NOLOGO"))
  1878.             logo = FALSE;
  1879.         if (s = FindToolType((CONST_STRPTR *) ToolArray, "ICONTYPE"))
  1880.         {   if (MatchToolValue(s, "DISK"))
  1881.             {   icon.type = WBDISK - 1;
  1882.             } elif (MatchToolValue(s, "DRAWER"))
  1883.             {   icon.type = WBDRAWER - 1;
  1884.             } elif (MatchToolValue(s, "TOOL"))
  1885.             {   icon.type = WBTOOL - 1;
  1886.             } elif (MatchToolValue(s, "PROJECT"))
  1887.             {   icon.type = WBPROJECT - 1;
  1888.             } elif (MatchToolValue(s, "TRASHCAN"))
  1889.             {   icon.type = WBGARBAGE - 1;
  1890.             } elif (MatchToolValue(s, "DEVICE"))
  1891.             {   icon.type = WBDEVICE - 1;
  1892.             } elif (MatchToolValue(s, "KICKSTART"))
  1893.             {   icon.type = WBKICK - 1;
  1894.             } elif (MatchToolValue(s, "APPICON"))
  1895.             {   icon.type = WBAPPICON - 1;
  1896.         }   }
  1897.         if (s = FindToolType((CONST_STRPTR *) ToolArray, "FUNCTION"))
  1898.         {   if (MatchToolValue(s, "1"))
  1899.                 page = 11;
  1900.             elif (MatchToolValue(s, "2"))
  1901.                 page = 21;
  1902.             elif (MatchToolValue(s, "3"))
  1903.                 page = 31;
  1904.             elif (MatchToolValue(s, "4"))
  1905.                 page = 41;
  1906.             elif (MatchToolValue(s, "5"))
  1907.                 page = 51;
  1908.             elif (MatchToolValue(s, "6"))
  1909.                 page = 61;
  1910.             elif (MatchToolValue(s, "7"))
  1911.                 page = 71;
  1912.             elif (MatchToolValue(s, "8"))
  1913.                 page = 81;
  1914.             elif (MatchToolValue(s, "9"))
  1915.                 page = 91;
  1916.             elif (MatchToolValue(s, "10"))
  1917.                 page = 101;
  1918.             elif (MatchToolValue(s, "11"))
  1919.             {   page = 111;
  1920.             } elif (MatchToolValue(s, "12"))
  1921.             {   page = 121;
  1922.         }   }
  1923.         FreeDiskObject(DiskObject);
  1924. }   }
  1925.  
  1926. AGLOBAL ULONG checkbreak(void)
  1927. {   struct IntuiMessage* MsgPtr;
  1928.     struct Gadget*       addr;
  1929.     ULONG                class;
  1930.     UWORD                code;
  1931.  
  1932.     while (MsgPtr = (struct IntuiMessage *) GT_GetIMsg(MainWindowPtr->UserPort))
  1933.     {   class  = MsgPtr->Class;
  1934.         code   = MsgPtr->Code;
  1935.         addr   = MsgPtr->IAddress;
  1936.         GT_ReplyIMsg((struct IntuiMessage *) MsgPtr);
  1937.         switch(class)
  1938.         {
  1939.         case IDCMP_CLOSEWINDOW:
  1940.             return(2);
  1941.         break;
  1942.         case IDCMP_GADGETUP:
  1943.             if (addr == BU99_Stop)
  1944.                 return(1);
  1945.         break;
  1946.         case IDCMP_VANILLAKEY:
  1947.             if (code == ESCAPE)
  1948.                 return(1);
  1949.         break;
  1950.         case IDCMP_REFRESHWINDOW:
  1951.             GT_BeginRefresh(MainWindowPtr);
  1952.             GT_EndRefresh(MainWindowPtr, TRUE);
  1953.         break;
  1954.         default:
  1955.         break;
  1956.     }   }
  1957.     return(0);
  1958. }
  1959.  
  1960. AGLOBAL void getdate(void)
  1961. {   struct DateTime DateTime;
  1962.  
  1963.     DateTime.dat_Format  = FORMAT_DOS;
  1964.     DateTime.dat_Flags   = NULL;
  1965.     DateTime.dat_StrDay  = weekdaystring;
  1966.     DateTime.dat_StrDate = datestring;
  1967.     DateTime.dat_StrTime = timestring;
  1968.  
  1969.     DateStamp(&(DateTime.dat_Stamp));
  1970.     if (!DateToStr(&DateTime))
  1971.         rq("Can't convert date!");
  1972. }
  1973.  
  1974. AGLOBAL void AddNameToTail(struct List* ListPtr, STRPTR name)
  1975. {   /* RKM Libraries, p. 496:
  1976.     
  1977.     "Allocate a NameNode structure, copy the given name into the
  1978.     structure, then add it [to] the...list." */
  1979.  
  1980.     struct NameNode* NameNodePtr;
  1981.  
  1982.     if (!(NameNodePtr = AllocMem(sizeof(struct NameNode), MEMF_CLEAR)))
  1983.         rq("Out of memory!");
  1984.     strcpy(NameNodePtr->nn_Data, name);
  1985.     NameNodePtr->nn_Node.ln_Name = NameNodePtr->nn_Data;
  1986.     NameNodePtr->nn_Node.ln_Type = NT_USER;
  1987.     NameNodePtr->nn_Node.ln_Pri  = 0;
  1988.     AddTail((struct List *) ListPtr, (struct Node *) NameNodePtr);
  1989. }
  1990. MODULE void AddPathnameToTail(struct List* ListPtr, STRPTR name)
  1991. {   struct PathnameNode* PathnameNodePtr;
  1992.  
  1993.     if (!(PathnameNodePtr = AllocMem(sizeof(struct PathnameNode), MEMF_CLEAR)))
  1994.         rq("Out of memory!");
  1995.     strcpy(PathnameNodePtr->nn_Data, name);
  1996.     PathnameNodePtr->nn_Node.ln_Name = PathnameNodePtr->nn_Data;
  1997.     PathnameNodePtr->nn_Node.ln_Type = NT_USER;
  1998.     PathnameNodePtr->nn_Node.ln_Pri  = 0;
  1999.     AddTail((struct List *) ListPtr, (struct Node *) PathnameNodePtr);
  2000. }
  2001.  
  2002. AGLOBAL void append(STRPTR pathname)
  2003. {   BPTR FileHandle;
  2004.  
  2005.     if (!(FileHandle = (BPTR) Open(pathname, MODE_READWRITE)))
  2006.         rq("Can't open file for appending!");
  2007.     Seek(FileHandle, 0, OFFSET_END);
  2008.     if (Write(FileHandle, IOBuffer, strlen(IOBuffer)) == -1)
  2009.     {   Close(FileHandle);
  2010.         rq("Can't append to file!");
  2011.     }
  2012.     if (!Close(FileHandle))
  2013.         rq("Can't close appended file!");
  2014. }
  2015.  
  2016. AGLOBAL ABOOL aboutloop(void)
  2017. {   struct IntuiMessage* MsgPtr;
  2018.     ABOOL                done = FALSE;
  2019.     UWORD                code, qual;
  2020.     ULONG                class;
  2021.  
  2022.     /* Processes any outstanding messages for the About... window.
  2023.        Returns TRUE if user wants to exit, FALSE otherwise.
  2024.        This should probably be done using ReAction, since it *is* a
  2025.        ReAction window, but this seems to work fine... */
  2026.  
  2027.     while (MsgPtr = (struct IntuiMessage *) GetMsg(AboutWindowPtr->UserPort))
  2028.     {   class = MsgPtr->Class;
  2029.         code  = MsgPtr->Code;
  2030.         qual  = MsgPtr->Qualifier;
  2031.         ReplyMsg((struct Message *) MsgPtr);
  2032.  
  2033.         if (class == CLOSEWINDOW)
  2034.             done = TRUE;
  2035.         elif (class == IDCMP_RAWKEY)
  2036.         {   if ((!(qual & IEQUALIFIER_REPEAT)) && code < KEYUP && (code < FIRSTQUALIFIER || code > LASTQUALIFIER))
  2037.                 done = TRUE;
  2038.     }   }
  2039.     return(done);
  2040. }
  2041.  
  2042. AGLOBAL void outputasl(STRPTR pattern)
  2043. {   asl(pattern);
  2044.     GT_SetGadgetAttrs
  2045.     (   ST99_Output,
  2046.         MainWindowPtr,
  2047.         NULL,
  2048.         GTST_String, aslresult,
  2049.         TAG_DONE
  2050.     );
  2051. }
  2052. AGLOBAL void outputstring(void)
  2053. {   strcpy
  2054.     (   shared.output,
  2055.         ((struct StringInfo *) ST99_Output->SpecialInfo)->Buffer
  2056.     );
  2057. }
  2058. AGLOBAL void drawgadgets(WORD gadgets)
  2059. {   if (!PrevGadPtr)
  2060.         rq("Can't create GadTools gadgets!");
  2061.     AddGList(MainWindowPtr, BU99_Right, (UWORD) ~0, gadgets, NULL);
  2062.     RefreshGList(BU99_Right, MainWindowPtr, NULL, -1);
  2063.     GT_RefreshWindow(MainWindowPtr, NULL);
  2064. }
  2065.  
  2066. AGLOBAL void parse(STRPTR terminator)
  2067. {   ABOOL done = FALSE;
  2068.     ULONG dest = 0; // index in destination string
  2069.  
  2070.     while (!done)
  2071.     {   if (IOBuffer[offset] != CR)
  2072.         {   string[dest] = IOBuffer[offset];
  2073.         }
  2074.         if (!strncmp(&IOBuffer[offset], terminator, strlen(terminator)))
  2075.         {   string[dest] = 0;
  2076.             done = TRUE;
  2077.             offset += strlen(terminator);
  2078.         } elif (offset > strlen(IOBuffer)) // we are past the end of the buffer
  2079.         {   string[0] = 0;
  2080.             done = TRUE;
  2081.         } else
  2082.         {   offset++;
  2083.             if (IOBuffer[offset] != CR)
  2084.             {   dest++;
  2085. }   }   }   }
  2086.  
  2087. AGLOBAL void parsetoend(void)
  2088. {   ABOOL done      = FALSE;
  2089.     ULONG suboffset = 0;
  2090.  
  2091.     while (!done)
  2092.     {   string[suboffset] = IOBuffer[offset];
  2093.         if (offset > strlen(IOBuffer))
  2094.         {   /* EOF */
  2095.             string[suboffset] = 0;
  2096.             done = TRUE;
  2097.         } else
  2098.         {   offset++;
  2099.             suboffset++;
  2100. }   }   }
  2101.  
  2102. AGLOBAL ABOOL saveasl(STRPTR message, STRPTR pattern)
  2103. {   struct FileRequester* ASLRqPtr;
  2104.     TEXT                  tempstring[VLONGFIELD + 1];
  2105.     ABOOL                 success;
  2106.  
  2107.     strcpy(tempstring, "Report+: ");
  2108.     strcat(tempstring, message);
  2109.  
  2110.     if (!(ASLRqPtr = AllocAslRequestTags(ASL_FileRequest, ASL_Pattern, "~(#?.info)", ASL_Window, MainWindowPtr, TAG_DONE)))
  2111.         rq("Can't create ASL request!");
  2112.     if
  2113.     (   AslRequestTags(ASLRqPtr, ASL_Dir, asldir, ASL_Hail, tempstring, ASL_FuncFlags, FILF_PATGAD | FILF_SAVE, TAG_DONE)
  2114.      && *(ASLRqPtr->rf_File) != 0
  2115.     )
  2116.     {   strcpy(asldir, ASLRqPtr->rf_Dir);
  2117.         strcpy(aslresult, ASLRqPtr->rf_Dir);
  2118.         if (!AddPart(aslresult, ASLRqPtr->rf_File, VLONGFIELD))
  2119.         {   FreeAslRequest(ASLRqPtr);
  2120.             rq("Can't add filename to pathname!");
  2121.         }
  2122.         success = TRUE;
  2123.     } else
  2124.     {   strcpy(aslresult, "");
  2125.         success = FALSE;
  2126.     }
  2127.     // assert(ASLRqPtr);
  2128.     FreeAslRequest(ASLRqPtr);
  2129.     return(success);
  2130. }
  2131.  
  2132. AGLOBAL void handlemenus(UWORD code)
  2133. {   /* struct MenuItem* ItemPtr; */
  2134.        BPTR             LockPtr;
  2135.  
  2136.     if (code != MENUNULL) /* while (code != MENUNULL) */
  2137.     {   /* ItemPtr = ItemAddress(MenuPtr, code); */
  2138.         switch (MENUNUM(code))
  2139.         {
  2140.         case MN_PROJECT:
  2141.             switch (ITEMNUM(code))
  2142.             {
  2143.             case IN_NEW:
  2144.                 if (shared.function == 1)
  2145.                     newreport(TRUE);
  2146.                 elif (page == 21)
  2147.                     newaminet(TRUE);
  2148.                 elif (shared.function == 4)
  2149.                     newautodoc(TRUE);
  2150.                 elif (page == 111)
  2151.                     newagdb(TRUE);
  2152.             break;
  2153.             case IN_OPEN:
  2154.                 if (shared.function == 1)
  2155.                     openreport();
  2156.                 elif (page == 21)
  2157.                     openaminet();
  2158.                 elif (shared.function == 4)
  2159.                     openautodoc();
  2160.                 elif (page == 91)
  2161.                 {   batt_open();
  2162.                 } elif (page == 111)
  2163.                     openagdb();
  2164.             break;
  2165.             case IN_SAVE:
  2166.                 if (shared.function == 1)
  2167.                     savereport(FALSE);
  2168.                 elif (page == 21)
  2169.                     saveaminet(FALSE);
  2170.                 elif (shared.function == 4)
  2171.                     saveautodoc(FALSE);
  2172.                 elif (page == 91)
  2173.                 {   batt_save(FALSE);
  2174.                 } elif (page == 111)
  2175.                     saveagdb(FALSE);
  2176.             break;
  2177.             case IN_SAVEAS:
  2178.                 if (shared.function == 1)
  2179.                     savereport(TRUE);
  2180.                 elif (page == 21)
  2181.                     saveaminet(TRUE);
  2182.                 elif (shared.function == 4)
  2183.                     saveautodoc(TRUE);
  2184.                 elif (page == 91)
  2185.                 {   batt_save(TRUE);
  2186.                 } elif (page == 111)
  2187.                     saveagdb(TRUE);
  2188.             break;
  2189.             case IN_QUIT:
  2190.                 cleanexit(EXIT_SUCCESS);
  2191.             break;
  2192.             default:
  2193.             break;
  2194.             }
  2195.         break;
  2196.         case MN_HELP:
  2197.             switch (ITEMNUM(code))
  2198.             {
  2199.             case IN_ABOUT:
  2200.                 helpabout();
  2201.             break;
  2202.             case IN_MANUAL:
  2203.                 LockPtr = Lock("CON:", ACCESS_READ);
  2204.                 if (SystemTags
  2205.                 (   "MultiView ReportPlus.guide",
  2206.                     SYS_Input,  (ULONG) LockPtr,
  2207.                     SYS_Output, NULL,
  2208.                     SYS_Asynch, TRUE,
  2209.                     TAG_DONE
  2210.                 ) == -1)
  2211.                 {   DisplayBeep(ScreenPtr);
  2212.                 }
  2213.                 UnLock(LockPtr);
  2214.             break;
  2215.             default:
  2216.             break;
  2217.             }
  2218.         break;
  2219.         default:
  2220.         break;
  2221.         }
  2222.         /* Doing things the above way disables multi-selection,
  2223.         but prevents `endless selection'.
  2224.         code = ItemPtr->NextSelect; */
  2225. }   }
  2226.  
  2227. AGLOBAL void lockscreen(void)
  2228. {   if (pubscreen[0])
  2229.     {   if (!(ScreenPtr = LockPubScreen(pubscreen)))
  2230.         {   rq("Can't lock specified public screen!");
  2231.     }   }
  2232.     else
  2233.     {   if (!(ScreenPtr = LockPubScreen(NULL)))
  2234.         {   rq("Can't lock default public screen!");
  2235. }   }   }
  2236. AGLOBAL void unlockscreen(void)
  2237. {   if (ScreenPtr)
  2238.     {   if (pubscreen[0])
  2239.         {   UnlockPubScreen(pubscreen, ScreenPtr);
  2240.             ScreenPtr = NULL;
  2241.         } else
  2242.         {   UnlockPubScreen(NULL, ScreenPtr);
  2243.             ScreenPtr = NULL;
  2244. }   }   }
  2245.  
  2246. AGLOBAL void getfillcolour(void)
  2247. {   if (fillwindows)
  2248.     {   lockscreen();
  2249.         fillcolour = FindColor
  2250.         (   ScreenPtr->ViewPort.ColorMap,
  2251.             0x99999999, /* red */
  2252.             0x99999999, /* green */
  2253.             0xFFFFFFFF, /* blue */
  2254.            -1
  2255.         );
  2256.         unlockscreen();
  2257.     } else fillcolour = 0;
  2258. }
  2259.  
  2260. MODULE void eachwildcard(STRPTR subpattern, ABOOL gui)
  2261. {   struct AnchorPath* AnchorPathPtr;
  2262.     BPTR               OldDir;
  2263.     BOOL               result;
  2264.     ABOOL              done;
  2265.  
  2266.     shared.thisfile[0] = 0;
  2267.     // AnchorPathPtr must be longword aligned
  2268.     if (!(AnchorPathPtr = AllocMem(sizeof(struct AnchorPath), MEMF_ANY | MEMF_PUBLIC)))
  2269.     {   return;
  2270.     }
  2271.  
  2272.     /* We can't do the processing of the files until we have finished
  2273.     all of the Match...() calls, due to lock problems. So we build a
  2274.     list of the pathnames. */
  2275.  
  2276.     AnchorPathPtr->ap_BreakBits = NULL;
  2277.     AnchorPathPtr->ap_Flags     = NULL;
  2278.     AnchorPathPtr->ap_Strlen    = 0;
  2279.     result = MatchFirst(subpattern, AnchorPathPtr);
  2280.     if (result == 0) // 0 means success
  2281.     {   OldDir = CurrentDir(AnchorPathPtr->ap_Current->an_Lock);
  2282.         if (!NameFromLock(AnchorPathPtr->ap_Current->an_Lock, shared.thisfile, VLONGFIELD))
  2283.         {   MatchEnd(AnchorPathPtr);
  2284.             return;
  2285.         }
  2286.         if (!AddPart(shared.thisfile, AnchorPathPtr->ap_Info.fib_FileName, VLONGFIELD))
  2287.         {   MatchEnd(AnchorPathPtr);
  2288.             return;
  2289.         }
  2290.         CurrentDir(OldDir);
  2291.         AddPathnameToTail(&FileList, shared.thisfile);
  2292.     } elif (result != ERROR_NO_MORE_ENTRIES)
  2293.     {   MatchEnd(AnchorPathPtr);
  2294.         return;
  2295.     }
  2296.  
  2297.     done = FALSE;
  2298.     while (!done)
  2299.     {   result = MatchNext(AnchorPathPtr);
  2300.         if (result == 0)
  2301.         {   OldDir = CurrentDir(AnchorPathPtr->ap_Current->an_Lock);
  2302.             if (!NameFromLock(AnchorPathPtr->ap_Current->an_Lock, shared.thisfile, VLONGFIELD))
  2303.             {   MatchEnd(AnchorPathPtr);
  2304.                 return;
  2305.             }
  2306.             if (!AddPart(shared.thisfile, AnchorPathPtr->ap_Info.fib_FileName, VLONGFIELD))
  2307.             {   MatchEnd(AnchorPathPtr);
  2308.                 return;
  2309.             }
  2310.             CurrentDir(OldDir);
  2311.             AddPathnameToTail(&FileList, shared.thisfile);
  2312.         } elif (result != ERROR_NO_MORE_ENTRIES)
  2313.         {   MatchEnd(AnchorPathPtr);
  2314.             return;
  2315.         } else done = TRUE;
  2316.     }
  2317.     MatchEnd(AnchorPathPtr);
  2318.     FreeMem(AnchorPathPtr, sizeof(struct AnchorPath));
  2319. }
  2320.  
  2321. AGLOBAL void multiasl(STRPTR pattern)
  2322. {   struct FileRequester* ASLRqPtr;
  2323.     ULONG                 i;
  2324.     TEXT                  quotestring[2];
  2325.  
  2326.     quotestring[0] = QUOTE;
  2327.     quotestring[1] = 0;
  2328.  
  2329.     /* It would also be good to correctly
  2330.     handle selection of directories. */
  2331.  
  2332.     if (!(ASLRqPtr = AllocAslRequestTags(ASL_FileRequest, ASL_Pattern, pattern, ASL_Window, MainWindowPtr, TAG_DONE)))
  2333.         rq("Can't create ASL request!");
  2334.     if (AslRequestTags(ASLRqPtr, ASL_Dir, asldir, ASL_Hail, "Report+ file multiselector", ASL_FuncFlags, FILF_PATGAD | FILF_MULTISELECT, TAG_DONE) && *(ASLRqPtr->rf_File) != 0)
  2335.     {   if (ASLRqPtr->rf_NumArgs)
  2336.         {   /* rf_ArgList is an array of WBArg structures. Each entry in
  2337.             this array corresponds to one of the files the user selected
  2338.             (in alphabetical order). The user multiselected; step through
  2339.             the list of selected files. */
  2340.  
  2341.             strcpy(asldir, ASLRqPtr->rf_Dir);
  2342.             strcpy(shared.pathname, quotestring);
  2343.             strcat(shared.pathname, ASLRqPtr->rf_Dir);
  2344.             if (!AddPart(shared.pathname, (ASLRqPtr->rf_ArgList)[0].wa_Name, VLONGFIELD))
  2345.             {   FreeAslRequest(ASLRqPtr);
  2346.                 rq("Can't add filename to pathname!");
  2347.             }
  2348.             strcat(shared.pathname, quotestring);
  2349.             strcat(shared.pathname, " ");
  2350.             for (i = 1; i < ASLRqPtr->rf_NumArgs; i++)
  2351.             {   strcat(shared.pathname, quotestring);
  2352.                 strcat(shared.pathname, ASLRqPtr->rf_Dir);
  2353.                 if (!AddPart(shared.pathname, (ASLRqPtr->rf_ArgList)[i].wa_Name, VLONGFIELD))
  2354.                    rq("Can't add filename to pathname!");
  2355.                 strcat(shared.pathname, quotestring);
  2356.                 if (i < ASLRqPtr->rf_NumArgs - 1)
  2357.                     strcat(shared.pathname, " ");
  2358.         }   }
  2359.         else
  2360.         {   /* The user didn't multiselect; use the normal way to get the
  2361.             filename. */
  2362.  
  2363.             strcpy(asldir, ASLRqPtr->rf_Dir);
  2364.             strcpy(shared.pathname, quotestring);
  2365.             strcat(shared.pathname, ASLRqPtr->rf_Dir);
  2366.             if (!AddPart(shared.pathname, ASLRqPtr->rf_File, VLONGFIELD))
  2367.             {   FreeAslRequest(ASLRqPtr);
  2368.                 rq("Can't add filename to pathname!");
  2369.             }
  2370.             strcat(shared.pathname, quotestring);
  2371.     }   }
  2372.     else
  2373.     {   ; // the user chose Cancel
  2374.     }
  2375.     // assert(ASLRqPtr);
  2376.     FreeAslRequest(ASLRqPtr);
  2377. }
  2378.  
  2379. AGLOBAL void checkabort(ABOOL gui)
  2380. {   struct Gadget*       addr;
  2381.     struct IntuiMessage* MsgPtr;
  2382.     ULONG                class, signals, gid, result;
  2383.     UWORD                code;
  2384.  
  2385.     /* OK, we've just finished operating on that file. Now before we */
  2386.     /* start on the next one, check whether the user still wants to... */
  2387.     signals = SetSignal(0L, 0L);
  2388.     if (signals & SIGBREAKF_CTRL_C)
  2389.     {   stop = TRUE;
  2390.         SetSignal(0L, SIGBREAKF_CTRL_C); /* clear the Ctrl-C signal */
  2391.         if (gui)
  2392.         {   if (page == 71)
  2393.             {   GT_SetGadgetAttrs
  2394.                 (   TE71_Status,
  2395.                     MainWindowPtr, NULL,
  2396.                     GTTX_Text, "Aborted by user!",
  2397.                     TAG_DONE
  2398.                 );
  2399.             } else
  2400.             {   /* assert(page == 121); */
  2401.                 SetGadgetAttrs
  2402.                 (   icon_gadgets[GID_12_ST2], MainWindowPtr, NULL,
  2403.                     STRINGA_TextVal, "Aborted by user!",
  2404.                     TAG_DONE
  2405.                 );
  2406.         }   }
  2407.         else
  2408.         {   Printf("Aborted by user!\n");
  2409.             Flush(Output());
  2410.     }   }
  2411.  
  2412.     if (page == 71)
  2413.     {
  2414.     while (MsgPtr = (struct IntuiMessage *) GT_GetIMsg(MainWindowPtr->UserPort))
  2415.     {   class  = MsgPtr->Class;                       
  2416.         addr   = MsgPtr->IAddress;
  2417.         GT_ReplyIMsg(MsgPtr);
  2418.         switch(class)
  2419.         {
  2420.         case IDCMP_CLOSEWINDOW:
  2421.             cleanexit(EXIT_SUCCESS);
  2422.         break;
  2423.         case IDCMP_GADGETUP:
  2424.             /* assert(gui); */
  2425.             if (addr == BU99_Stop)
  2426.             {   GT_SetGadgetAttrs
  2427.                 (   TE71_Status,
  2428.                     MainWindowPtr, NULL,
  2429.                     GTTX_Text, "Aborted by user!",
  2430.                     TAG_DONE
  2431.                 );
  2432.                 stop = TRUE;
  2433.             }
  2434.         break;
  2435.         default:
  2436.         break;
  2437.     }   }
  2438.     } else
  2439.     {   /* assert(page == 121); */
  2440.         while ((result = DoMethod(WinObject[12], WM_HANDLEINPUT, &code)) != WMHI_LASTMSG)
  2441.         {   switch (result & WMHI_CLASSMASK)
  2442.             {
  2443.             case WMHI_MENUPICK:
  2444.                 ; /* handlemenus(code); */
  2445.             break;
  2446.             case WMHI_CLOSEWINDOW:
  2447.                 done = quit = TRUE;
  2448.             break;
  2449.             case WMHI_GADGETUP:
  2450.                 gid = result & WMHI_GADGETMASK;
  2451.                 if (gid == GID_12_BU4)
  2452.                 {   stop = TRUE;
  2453.                 }
  2454.             break;
  2455.             default:
  2456.             break;
  2457. }   }   }   }
  2458.  
  2459. AGLOBAL void convert(ABOOL gui)
  2460. {   ULONG        i, j, length;
  2461.     ABOOL        letters, /* are we in letters (TRUE) or whitespace (FALSE)? */
  2462.                  quoted;  /* are we quoted (TRUE) or unquoted (FALSE)? */
  2463.     struct Node* NodePtr;
  2464.  
  2465.     /* At this point we have a list of pathnames, separated by spaces and
  2466.     NULL-terminated. If they came from ASL, they will be quoted, otherwise,
  2467.     they may not. This is the raw input; it can contain anything,
  2468.     including wildcards.
  2469.  
  2470.     shared.pathname: the actual contents of the string gadget.
  2471.     shared.thatfile: each file that we pass to eachwildcard().
  2472.     shared.thisfile: each file that we pass for conversion. */
  2473.  
  2474.     stop = letters = quoted = FALSE;
  2475.     length = strlen(shared.pathname);
  2476.     j = 0;
  2477.  
  2478.     for (i = 0; i < length; i++)
  2479.     {   if (!stop)
  2480.         {   if (shared.pathname[i] == ' ' && letters && !quoted)
  2481.             {   /* if we're unquoted and have a space */
  2482.                 shared.thatfile[j] = 0; /* then NULL-terminate the pathname */
  2483.                 eachwildcard(shared.thatfile, gui);
  2484.                 j = 0;
  2485.                 letters = FALSE;
  2486.             } elif (shared.pathname[i] == QUOTE)
  2487.             {   if (!letters && !quoted)
  2488.                 {   letters = TRUE; /* we're in letters */
  2489.                     quoted = TRUE; /* it's a quote */
  2490.                 } elif (letters && quoted)
  2491.                 {   quoted = FALSE; /* it's an unquote */
  2492.             }   }
  2493.             else
  2494.             {   shared.thatfile[j++] = shared.pathname[i];
  2495.                 letters = TRUE; /* we're in letters */
  2496.     }   }   }
  2497.     /* Now we are at the end. */
  2498.     if (!stop && letters) /* if we're in letters */
  2499.     {   shared.thatfile[j] = 0;
  2500.         /* then it is ended, quoted or not. Although we could */
  2501.         /* report an error condition if there are an odd */
  2502.         /* number of quotes (ie. a missing quote). */
  2503.         eachwildcard(shared.thatfile, gui);
  2504.     }
  2505.     // Walk the list
  2506.     for
  2507.     (   NodePtr = FileList.lh_Head;
  2508.         NodePtr->ln_Succ;
  2509.         NodePtr = NodePtr->ln_Succ
  2510.     )
  2511.     {   if (!stop)
  2512.         {   strcpy(shared.thisfile, NodePtr->ln_Name);
  2513.             if (shared.function == 7)
  2514.             {   eolconvert(gui);
  2515.             } else
  2516.             {   /* assert(shared.function == 12); */
  2517.                 iconconvert(gui);
  2518.     }   }   }
  2519.     clearpathlist(&FileList);
  2520. }
  2521.  
  2522. MODULE void menu_loop(ULONG gid)
  2523. {   switch (gid)
  2524.     {
  2525.     case GID_0_BU1:
  2526.         page = 11;  // bug report
  2527.     break;
  2528.     case GID_0_BU2:
  2529.         page = 21;  // Aminet readme
  2530.     break;
  2531.     case GID_0_BU3:
  2532.         page = 41;  // autodoc
  2533.     break;
  2534.     case GID_0_BU4:
  2535.         page = 91;  // battery RAM
  2536.     break;
  2537.     case GID_0_BU5:
  2538.         page = 111; // AGDB review
  2539.     break;
  2540.     case GID_0_BU6:
  2541.         page = 51;  // ID database
  2542.     break;
  2543.     case GID_0_BU7:
  2544.         page = 61;  // IFF FORMs
  2545.     break;
  2546.     case GID_0_BU8:
  2547.         page = 71;  // EOL/tabs
  2548.     break;
  2549.     case GID_0_BU9:
  2550.         page = 121; // icons
  2551.     break;
  2552.     case GID_0_BU10:
  2553.         page = 81;  // path size
  2554.     break;
  2555.     case GID_0_BU11:
  2556.         page = 101; // system files
  2557.     break;
  2558.     case GID_0_BU12:
  2559.         page = 31;  // ACSE
  2560.     break;
  2561.     default:
  2562.         ; // assert(0);
  2563.     break;
  2564. }   }
  2565.  
  2566. AGLOBAL ULONG Hook0Func(struct Hook *h, VOID *o, VOID *msg)
  2567. {   /* "When the hook is called, the data argument points to the 
  2568.     window object and message argument to the IntuiMessage."
  2569.  
  2570.     These IntuiMessages do not need to be replied to by the appliprog. */
  2571.  
  2572.     AUTO    UWORD code, qual;
  2573.     AUTO    ULONG class, i;
  2574.     AUTO    SWORD mousex, mousey;
  2575.     AUTO    SLONG newover;
  2576.     PERSIST ULONG over = FUNCTIONS;
  2577.  
  2578.     geta4(); // wait till here before doing anything
  2579.  
  2580.     class  = ((struct IntuiMessage *) msg)->Class;
  2581.     code   = ((struct IntuiMessage *) msg)->Code;
  2582.     qual   = ((struct IntuiMessage *) msg)->Qualifier;
  2583.     mousex = ((struct IntuiMessage *) msg)->MouseX;
  2584.     mousey = ((struct IntuiMessage *) msg)->MouseY;
  2585.  
  2586.     switch(class)
  2587.     {
  2588.     case IDCMP_RAWKEY:
  2589.         switch(code)
  2590.         {
  2591.         case SCAN_HELP:
  2592.             helpabout();
  2593.         break;
  2594.         case SCAN_ESCAPE:
  2595.             cleanexit(EXIT_SUCCESS);
  2596.         break;
  2597.         case SCAN_GRAVE:
  2598.             if (qual & IEQUALIFIER_CONTROL)
  2599.             {   decrypt();
  2600.             }
  2601.         break;
  2602.         default:
  2603.         break;
  2604.         }
  2605.     break;
  2606.     case IDCMP_INTUITICKS:
  2607.     {   newover = FUNCTIONS;
  2608.         for (i = 0; i < FUNCTIONS; i++)
  2609.         {   if
  2610.             (   mousex >= gadgets[GID_0_BU1 + i]->LeftEdge
  2611.              && mousex <= gadgets[GID_0_BU1 + i]->LeftEdge + gadgets[GID_0_BU1 + i]->Width  - 1
  2612.              && mousey >= gadgets[GID_0_BU1 + i]->TopEdge
  2613.              && mousey <= gadgets[GID_0_BU1 + i]->TopEdge  + gadgets[GID_0_BU1 + i]->Height - 1
  2614.             )
  2615.             {   newover = i;
  2616.                 break;
  2617.         }   }
  2618.         if (newover != over)
  2619.         {   over = newover;
  2620.             SetGadgetAttrs
  2621.             (   gadgets[GID_0_ST1], MainWindowPtr, NULL,
  2622.                 STRINGA_TextVal, FunctionDesc[over],
  2623.                 TAG_DONE
  2624.             );
  2625.     }   }
  2626.     break;
  2627.     default:
  2628.     break;
  2629.     }
  2630.  
  2631.     return(1);
  2632. }
  2633.  
  2634. /* This function converts register-parameter Hook calling convention into
  2635. standard C conventions. It requires a C compiler that supports
  2636. registerized parameters, such as SAS/C 5.x or greater. */
  2637.  
  2638. AGLOBAL ULONG ASM hookEntry(REG(a0) struct Hook *h, REG(a2) VOID *o, REG(a1) VOID *msg)
  2639. {   // This is the stub function that converts the register-parameters
  2640.     // to stack parameters.
  2641.  
  2642.     return ((*(ULONG (*)(struct Hook *, VOID *, VOID *))(*h->h_SubEntry))(h, o, msg));
  2643. }
  2644.  
  2645. AGLOBAL void InitHook(struct Hook* hook, ULONG (*func)(), void* data)
  2646. {   // Make sure a pointer was passed
  2647.  
  2648.     if (hook)
  2649.     {   // Fill in the Hook fields
  2650.         hook->h_Entry    = (ULONG (*)()) hookEntry;
  2651.         hook->h_SubEntry = func;
  2652.         hook->h_Data     = data;
  2653.     } else
  2654.     {   Printf("Report+: Can't initialize hook (NULL pointer)!");
  2655.         cleanexit(EXIT_FAILURE);
  2656. }   }
  2657.  
  2658. AGLOBAL void clearlist(struct List* ListPtr)
  2659. {   if (ListPtr->lh_Head->ln_Succ) // if list is non-empty
  2660.     {   FreeNameNodes(ListPtr);
  2661.     }
  2662.     NewList(ListPtr); // prepare for reuse
  2663. }
  2664. MODULE void clearpathlist(struct List* ListPtr)
  2665. {   if (ListPtr->lh_Head->ln_Succ) // if list is non-empty
  2666.     {   FreePathnameNodes(ListPtr);
  2667.     }
  2668.     NewList(ListPtr); // prepare for reuse
  2669. }
  2670.  
  2671. // Function to free an Exec List of ReAction ListBrowser nodes.
  2672. AGLOBAL void clearreactionlist(struct List* ListPtr)
  2673. {   /* Requirements: listbrowser class must be already open, and list
  2674.     must be detached from gadget*/
  2675.  
  2676.     if (ListPtr->lh_Head->ln_Succ) // if list is non-empty
  2677.     {   FreeListBrowserList(ListPtr);
  2678.     }
  2679.     NewList(ListPtr); // prepare for reuse
  2680. }
  2681.  
  2682. AGLOBAL void openwindow(void)
  2683. {   // Opens a ReAction window.
  2684.  
  2685.     if (!(MainWindowPtr = (struct Window *) DoMethod(WinObject[shared.function], WM_OPEN, NULL)))
  2686.     {   rq("Can't open ReAction window!");        
  2687.     }
  2688.  
  2689.     // Obtain the window wait signal mask.
  2690.     GetAttr(WINDOW_SigMask, WinObject[shared.function], &signal);
  2691. }
  2692.  
  2693. AGLOBAL ABOOL ra_checkbreak(void)
  2694. {   ULONG result;
  2695.     UWORD code;
  2696.  
  2697.     while ((result = DoMethod(WinObject[shared.function], WM_HANDLEINPUT, &code)) != WMHI_LASTMSG)
  2698.     {   switch (result & WMHI_CLASSMASK)
  2699.         {
  2700.         case IDCMP_RAWKEY:
  2701.             if (code == SCAN_ESCAPE)
  2702.                 return(1);
  2703.         break;
  2704.         case WMHI_CLOSEWINDOW:
  2705.              return(2);
  2706.         break;
  2707.         case WMHI_GADGETUP:
  2708.              if (shared.function == 8)
  2709.              {   if ((result & (WMHI_GADGETMASK)) == GID_8_BU5) // these parentheses are needed!
  2710.                  {   return(1);
  2711.              }   }
  2712.              else
  2713.              {   // assert(shared.function == 10);
  2714.                  if ((result & (WMHI_GADGETMASK)) == GID_10_BU3) // these parentheses are needed!
  2715.                  {   return(1);
  2716.              }   }
  2717.         break;
  2718.         default:
  2719.         break;
  2720.     }   }
  2721.     return(0);
  2722. }
  2723.